Mod_rewrite 规则从特定路径重定向到另一个路径被完全忽略

Mod_rewrite 规则从特定路径重定向到另一个路径被完全忽略

我需要重定向http://1.2.3.4/foohttp://1.2.3.4/WebFOO。我在 ApacheRoot\conf\httpd.conf 中创建的规则如下所示:

RewriteEngine On
RewriteRule ^/?foo /WebFOO [R,L]

然而,即使这个规则在语法上是正确的,这种方法也行不通。意味着我连接到http://1.2.3.4/foo并获取 404 或“/foo”的特定内容。注意:为了测试,我在 (htdocs/foo) 中创建了一个包含简单 index.html 的文件夹。这当然可以防止 404,但重定向仍然没有发生。

虚拟主机部分如下所示,位于 mod-rewrite 规则之下:

ServerName 1.2.3.4
<VirtualHost *:80>
  ServerName 1.2.3.4:80
  #Redirect permanent / https://1.2.3.4/
</VirtualHost>

为什么该重定向被完全忽略?我能否以某种方式检查服务器是否至少识别该规则(到目前为止 error.log 中没有重写条目)?

注意:为了确保规则的语法正确性,我还对其进行了测试http://htaccess.madewithlove.be

重写规则测试器结果

不仅这个测试运行良好,而且诸如此类的事情也运行良好/foo/index.html。它被正确地翻译成了/WebFOO/index.html

注意:按照 mod_rewrite 经典问题之一的建议启用详细日志记录回答不适合 apache 2.4:

对于更复杂的规则,请使用 mod_rewrite 的 RewriteLog 指令将活动记录到文件中,并设置 RewriteLogLevel 3

自 Apache httpd 2.4 起,mod_rewrite RewriteLog 和 RewriteLogLevel 指令已被新的每个模块日志配置完全取代。

LogLevel alert rewrite:trace6

重写日志

熟悉早期版本的 mod_rewrite 的人无疑会寻找 RewriteLog 和 RewriteLogLevel 指令。此功能已完全被上述新的每个模块日志配置所取代。要获取特定于 mod_rewrite 的日志消息,请通过 grep 管道传输日志文件:tail -f error_log|fgrep '[rewrite:'

  • [rewrite:我的 ApacheRoot\logs\error.log 中没有任何条目

答案1

RewriteRule ^/foo$ WebFOO [R]

请尝试以下操作:

RewriteRule ^/?foo /WebFoo [R,L]

答案2

首先,为什么要在 vHost 之外定义 RewriteRule?尝试在 vHost 内定义规则。我还将 vHost 内的 ServerName 更正为:

ServerName 1.2.3.4

此外,LogLevel 部分应该位于 vHost 内。要查看 Rewrite 是否正常工作,请使用 Chrome 开发人员工具进行检查,您可以在那里检查是否获得 301。也许重定向后会获得 404?

相关内容