Reputation: 21
There's a couple other questions on this same topic on here that I've read, but mine is slightly different. I'm trying to do a very basic mod_rewrite:
RewriteEngine on
RewriteRule ^go/([^/\.]+)/?$ /go.php?page=$1
go.php
looks like this:
<?php
ini_set('display_errors',1);
if(isset($_GET['page'])){
echo 'page='.$_GET['page'];
}else{
echo 'oh shnizzle!';
}
?>
Now, when I go to /go/someword
in my browser, the $_GET
param "someword" IS NOT passed along, and I get the message "oh shnizzle!" every time. What are possible reasons I'm not able to pass any $_GET
params through mod_rewrite?
Upvotes: 2
Views: 4994
Reputation: 19169
You probably have MultiViews
turned on. Add this to the top of your .htaccess
file:
Options -MultiViews
And the problem should go away, hopefully.
To elaborate a little on what's going on if this is the case, your URL /go/someword
points to a non-existent resource, so MultiViews
transforms it into /go.php
, which does exist. When this happens, the /somewhere
bit is passed to PHP as $_SERVER['PATH_INFO']
, but go.php
doesn't match your rewrite rule, so the rewrite is not performed to write that query string.
Upvotes: 13
Reputation: 10341
A few ideas...
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^/go/([^/\.]+)/?$ /go.php?page=$1 [QSA]
This should stop the mod_rewrite rules from being triggered if a valid page, script or directory is requested. It will also append any existing Query Strings.
In the go.php file, I would have the following:
<?php
ini_set('display_errors',1);
echo '<b>$_GET Variables</b><pre>';
var_dump( $_GET );
echo '</pre>';
?>
That way, rather than looking for a specific variable (at least until it behaves itself) you can see exactly what GET variables are being passed to the script.
Upvotes: 0
Reputation: 11535
You need the QSA (query string append) flag on your rewrite rule.
RewriteEngine on
RewriteRule ^go/([^/\.]+)/?$ /go.php?page=$1 [QSA]
Upvotes: 8