Apache .htaccess在查询与目录匹配时发出HTTP重定向
我使用mod_rewrite将查询发送到PHP,以便在CMS中处理。我的问题是:如果查询是目录名,那么发送到PHP的查询将添加到URL中 代码如下:Apache .htaccess在查询与目录匹配时发出HTTP重定向,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我使用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?
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将重定向(而不是静默地)到
将查询添加到原始请求的末尾。Apache仍然提供PHP输出,但它更改了用户地址栏中的URL
因此,我需要阻止将查询添加到请求中,即使该查询是目录名。这是一个
目录斜杠问题,当您尝试访问目录时,apache会用一个尾随斜杠重定向
您可以关闭DirectorySlash
(注意有),或者尝试让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
路由所有现有目录,安全警告可能会被忽略。我使用了上面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]
谢谢我最终使用了第二个选项,因为我希望在默认情况下添加尾部斜杠。我对斜杠重写做了一个小改动(见我的答案)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/$ /process.php\?query=$1 [QSA,NC,L]