我正在使用mod_rewrite向PHP发送查询以便在CMS中进行处理。我的问题:如果查询是目录的名称,则发送给PHP的查询将添加到URL中。
以下是代码:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /process.php\?query=$1 [QSA,NC,L]
因此,如果用户键入
http://example.com/lolcats
mod_rewrite以静默方式重定向到
http://example.com/process.php?query=lolcats
这很棒。但如果lolcats
是一个目录,mod_rewrite会重定向(非静默)到
http://example.com/lolcats/?query=lolcats
将查询添加到原始请求的末尾。 Apache仍然提供PHP输出,但它会更改用户地址栏中的URL。
所以即使查询是目录的名称,我也需要停止将查询添加到请求中。
答案 0 :(得分:1)
这是一个DirectorySlash
问题,当您尝试访问目录时,apache会使用尾部斜杠重定向。
你可以转DirectorySlash Off
(注意有a security warning concerning turning this off),或者尝试让mod_rewrite抢先处理它,例如:
# Above your existing rules
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)$ /$1/ [R=301,L]
# and small modification to your existing rule to handle trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/$ /process.php\?query=$1 [QSA,NC,L]
如果您通过process.php
路由所有现有目录,则可能会忽略安全警告。
答案 1 :(得分:1)
我使用了上面Jon Lin提供的解决方案,稍微修改了添加尾部斜杠的规则:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ $1/ [L,R=301]
这使规则适用于包含多个斜杠的地址,例如
http://example.com/path/to/page
对PHP的主要重写正如Jon指出的那样:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/$ /process.php\?query=$1 [QSA,NC,L]