我建议将您的重写更改为:
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]
更新
那么为什么你的配置有如此奇怪的行为(工作与否)?如果没有更多信息(即您的暂定的完整重写日志),我无法给出答案。
一开始我还没有得到这个,你的配置(第一个问题和第二个评论)都不能工作,因为它们/
在每个重写前面都错过了一个。
这个假设的证据在 rewrite log 中,在第四行,有一个成功的匹配。/
如果没有第一个重写模式,该匹配是不可能的。从这一点开始,所有剩余的日志行都描述了成功匹配的行为。