【问题标题】:How do I troubleshoot why my rewrite rules aren't being applied by apache?如何解决为什么我的重写规则没有被 apache 应用?
【发布时间】:2008-10-18 17:35:55
【问题描述】:

我有一个以 apache httpd 作为前端运行的 tomcat 6 Web 应用程序。我正在使用 mod_proxy 和 mod_proxy_ajp 将请求转发到 tomcat。我的服务器正在运行 ubuntu。现在我正在尝试使用 mod_rewrite 删除领先的 www,这样我的规范网站 url 是 http://domain.com 而不是 http://www.domain.com

我已经阅读了许多关于使用 mod_rewrite 的教程,但我无法让任何重写工作。我尝试将重写规则放在 .htaccess 文件中(在修改我的 /etc/apache/sites-available/default 文件以设置 AllowOverride all 之后)。我尝试将重写规则放在 apache2.conf、httpd.conf 和 rewrite.conf 中。我已经在打开重写日志的情况下尝试了所有这些。日志文件被创建,但 apache 没有写入任何内容。我想也许 mod_proxy 会以某种方式阻止使用重写规则,所以我也尝试禁用它……但我仍然没有重写,日志也没有。

在这一点上,我完全不知道下一步该尝试什么。我该如何解决为什么 apache 没有使用我的重写规则?

作为参考,这里是我的重写指令:

<IfModule mod_rewrite.c>

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
    RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
    RewriteLog "/var/log/apache2/rewrite.log"
    RewriteLogLevel 3

</IfModule>

编辑:下面的回答对我的特殊情况很有帮助,但对整个社区的帮助可能不如关于如何排除 apache 指令的一般问题的回答那么有帮助。例如,有没有办法启用日志记录,它会告诉我在请求进入时以哪个顺序应用哪些指令?

编辑 2:我现在已经开始工作了。我的虚拟主机设置不正确,我也没有完全正确地重写正则表达式。这是我要工作的最终重写指令:

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
        RewriteRule ^(.*)$ http://domain.com$1 [L,R=301]
</IfModule>

【问题讨论】:

  • 你确定 mod_rewrite 已经加载了吗?
  • 是的。我使用“a2enmod rewrite”加载它,它在 mods-enabled 中设置了一个符号链接,指向 mod-available 中的 mod_rewrite.load。我还尝试故意拼写错误的重写规则之一(即“Rewrite3Rule”)来测试规则是否实际上被 apache 拾取,并且 apache 给了我一个错误消息,正如我所期望的那样。当我修复拼写并重新启动 apache 时,它​​重新启动正常。

标签: apache tomcat mod-rewrite


【解决方案1】:

尝试回答您的问题:要调试 Apache 操作,您可以将 LogLevel 调整为较低级别(可能是 debug)。但是,即使您输入debug,如果您禁用相关模块的日志,您也不会从中收到任何消息。例如,默认[RequestLogLevel][2] 为0,例如,模块不写任何消息。我看到您将其设置为 3,但就像 RoBorg 说将其更改为 9 可能对您的情况来说太低了。

尝试解决您的问题:尝试更改使用相反形式重写主机名的方式 - 查看主机名是否是您想要的,如果不是,请将其更改为您想要的主机名.就像 Apache 站点的 URL Rewriting Guide - Apache HTTP Server 中所述:

规范主机名

说明: 此规则的目标是强制使用特定的主机名,在 对其他主机名的偏好 可用于到达同一站点。 例如,如果您希望强制 使用 www.example.com 而不是 example.com,您可能会使用变体 以下食谱。解决方案:

# To force the use of 
RewriteEngine On
RewriteCond %{HTTP_HOST}   !^www\.example\.com [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteRule ^/(.*)         http://www.example.com/$1 [L,R]

在他们的示例中,它们从 example.com 更改为 www.example.com,但您明白了。只需根据您的情况进行调整即可。

【讨论】:

  • 在这种情况下转义点字符不会产生影响
  • 即使转义点仅匹配实际点,点仍将匹配点,未转义点将匹配任何内容,包括点应该匹配的点。
【解决方案2】:

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
    RewriteRule ^(.*)$ "http\:\/\/domain\.com\/$1" [R=301,L]

</IfModule>

我的服务器也出现了同样的问题,但是这行得通

【讨论】:

    【解决方案3】:

    尝试将日志记录级别提高到 9(最大值)。
    确保 apache 对日志文件具有适当的权限(尽管如果它创建它,它似乎也可以写入它)。
    尝试不同的重写规则,没有条件,例如RewriteRule .* www.google.com [RL]

    【讨论】:

    • 好建议,但我仍然没有看到重写工作或日志中的任何内容。
    【解决方案4】:

    这些规则放置在什么环境中?例如,您可能将它们放在不同的虚拟主机下。如果您只有一个域要测试,请尝试将它们放在任何容器之外。

    无论如何,实现“无www”的替代方法是使用两个虚拟主机,一个用于www,另一个用于“no-www”。 www 一个重定向到另一个:

    <VirtualHost *:80>
        ServerName www.domain.com
        Redirect permanent / http://domain.com
    </VirtualHost>
    
    
    <VirtualHost *:80>
        ServerName domain.com
        #The rest of the configuration (proxying, etc.)
    </VirtualHost>
    

    【讨论】:

    • 我已经尝试将这些放在我的 /etc/apache2/apache2.conf、/etc/apache2/httpd.conf、/etc/apache2/mods-available/rewrite.conf(符号链接来自 /etc/apache2/mods-enabled)。我的理解是这些规则将永远适用。我这里只运行一个域/虚拟主机。
    • 我尝试了你的建议,apache 抱怨包含端口 80 部分 (:80):[错误] VirtualHost *:80 -- 混合 * 端口和非 端口不支持带有 NameVirtualHost 地址的,继续进行未定义的结果。我取出端口号,重启正常,但没有重定向。
    • 这种情况更适合 IRC 而不是 Stack Overflow。有很多配置需要调试。如果这里的建议都不起作用,请在 irc.freenode.net 上尝试 #apache。
    猜你喜欢
    • 2013-01-09
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多