1

我正在使用 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。

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

4

2 回答 2

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]
于 2012-08-06T14:23:31.183 回答
1

这是一个DirectorySlash问题,当您尝试访问目录时,apache 会使用尾部斜杠进行重定向。

您可以打开DirectorySlash 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,则可能会忽略安全警告。

于 2012-08-06T03:31:56.207 回答