我有重写规则:
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'。
我无法理解为什么它不能正常工作,因为除了一个目录之外它是相同的并且它工作正常。任何帮助将不胜感激。
答案 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]
<强>更新强>
那么为什么你的配置有这么奇怪的行为(工作与否)?如果没有更多信息(即你的试用版的全部重写),我无法给出答案。
一开始我没有那个,你的配置(第一个问题和评论中的第二个)都不能正常工作,因为他们错过了每个重写前的/
。
这个假设的证据是在重写日志中,在第四行,有一个成功的匹配。如果没有重写模式中的/
,则该匹配是不可能的。
从这一点开始,所有剩余的日志行都描述了成功匹配的行为。