问题
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?
回答1:
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.
回答2:
You need the QSA (query string append) flag on your rewrite rule.
RewriteEngine on
RewriteRule ^go/([^/\.]+)/?$ /go.php?page=$1 [QSA]
回答3:
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.
来源:https://stackoverflow.com/questions/3223035/getting-mod-rewrite-to-pass-get-params