.htaccess在查询与目录匹配时发出HTTP重定向

时间:2012-08-06 03:22:03

标签: 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?query=lolcats

这很棒。但如果lolcats是一个目录,mod_rewrite会重定向(非静默)到

http://example.com/lolcats/?query=lolcats

将查询添加到原始请求的末尾。 Apache仍然提供PHP输出,但它会更改用户地址栏中的URL。

所以即使查询是目录的名称,我也需要停止将查询添加到请求中。

2 个答案:

答案 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]