0

我有重写规则:

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 作为链接中的用户返回。我已经测试了 ?user 正在设置,即使 URL 是 ../remove/username 它也不会将用户名显示为 ?user 信息,它会显示“index.php”。

我不明白为什么这不能像以前一样工作,除了一个目录,它工作正常。任何帮助将不胜感激。

4

1 回答 1

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]

更新

那么为什么你的配置有如此奇怪的行为(工作与否)?如果没有更多信息(即您的暂定的完整重写日志),我无法给出答案。

一开始我还没有得到这个,你的配置(第一个问题和第二个评论)都不能工作,因为它们/在每个重写前面都错过了一个。

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

于 2013-01-25T22:49:06.177 回答