7

我有一个以 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>
4

4 回答 4

4

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

尝试解决您的问题:尝试更改使用相反形式重写主机名的方式 - 查看主机名是否是您想要的,如果不是,请将其更改为您想要的主机名。如URL 重写指南 - Apache 站点上的Apache HTTP 服务器中所述:

规范主机名

说明:此规则的目标是强制使用特定主机名,优先于可用于访问同一站点的其他主机名。例如,如果您希望强制使用 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但您明白了。只需根据您的情况进行调整。

于 2008-10-18T19:08:59.390 回答
1

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

</IfModule>

我的服务器有同样的问题,但这有效

于 2008-10-18T18:12:27.583 回答
0

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

于 2008-10-18T18:00:26.597 回答
0

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

在任何情况下,实现“无www”的另一种方法是使用两个虚拟主机,一个用于www,另一个用于“无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>
于 2008-10-18T18:16:16.750 回答