.htaccess重写规则忽略GET

时间:2013-01-25 22:40:38

标签: php apache .htaccess mod-rewrite url-rewriting

我有重写规则:

RewriteRule ^ajax/favourite/([^/]*)$ ajax/favourite/user/index.php?user=$1 [L]

哪种方法可行,但这条规则:

RewriteRule ^ajax/favourite/remove/([^/]*)$ ajax/favourite/remove/index.php?user=$1 [L]

始终以链接中的用户身份返回index.php。我已经测试了?用户正在设置,即使URL是../remove/username它没有显示用户名作为用户信息,它显示'index.php'。

我无法理解为什么它不能正常工作,因为除了一个目录之外它是相同的并且它工作正常。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我建议改变你的重写:

RewriteRule ^/ajax/favourite/([^/]+)$ /ajax/favourite/user/index.php?user=$1 [L]

RewriteRule ^/ajax/favourite/remove/([^/]+)$ /ajax/favourite/remove/index.php?user=$1 [L]

请注意我在正则表达式前添加了/ ,并在后面的引用中更改了*中的+,因为在这两者中你应该期望至少有一个字符作为用户名。

我还可以建议,如果你无法弄清楚为什么你的重写规则没有按预期工作,你可以在apache配置中启用重写日志。您的虚拟主机应该是放置它的最佳位置:

RewriteLogLevel 9
RewriteLog /var/log/http/yourserver.log

重写日志将显示apache在请求处理期间采取的所有假设和操作。你会看到你的重写规则究竟出了什么问题。

请注意,此日志应在生产中停用。

我还在我的环境中复制了你的案例,这是你在重写规则正确匹配时应该看到的日志:

(2) init rewrite engine with requested uri /ajax/favourite/remove/provola
(3) applying pattern '^/ajax/favourite/([^/]+)$' to uri '/ajax/favourite/remove/provola'
(3) applying pattern '^/ajax/favourite/remove/([^/]+)$' to uri '/ajax/favourite/remove/provola'
(2) rewrite '/ajax/favourite/remove/provola' -> '/ajax/favourite/remove/index.php?user=provola'
(3) split uri=/ajax/favourite/remove/index.php?user=provola -> uri=/ajax/favourite/remove/index.php, args=user=provola
(2) local path result: /ajax/favourite/remove/index.php
(2) prefixed with document_root to /opt/local/apache2/htdocs/ajax/favourite/remove/index.php
(1) go-ahead with /opt/local/apache2/htdocs/ajax/favourite/remove/index.php [OK]

<强>更新

那么为什么你的配置有这么奇怪的行为(工作与否)?如果没有更多信息(即你的试用版的全部重写),我无法给出答案。

一开始我没有那个,你的配置(第一个问题和评论中的第二个)都不能正常工作,因为他们错过了每个重写前的/

这个假设的证据是在重写日志中,在第四行,有一个成功的匹配。如果没有重写模式中的/,则该匹配是不可能的。 从这一点开始,所有剩余的日志行都描述了成功匹配的行为。