如何解决为什么我的重写规则没有被apache应用?

时间:2008-10-18 17:35:55

标签: apache tomcat mod-rewrite

我有一个以apache httpd作为前端运行的tomcat 6网络应用程序。我正在使用mod_proxy和mod_proxy_ajp将请求转发给tomcat。我的服务器正在运行ubuntu。现在我正在尝试使用mod_rewrite删除前导www,以便我的规范网站网址为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 个答案:

答案 0 :(得分:4)

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

尝试解决您的问题:尝试使用反向表单更改重写主机名的方式 - 查看主机名是否符合您的要求,如果没有,则将其更改为您想要的主机名。如在Apache站点的URL Rewriting Guide - Apache HTTP Server中所述:

  

Canonical Hostnames

     

<强>描述:       此规则的目标是强制使用特定主机名   偏爱其他主机名   可用于到达同一站点。   例如,如果你想强迫   使用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,但您明白了。只需根据您的情况进行调整。

答案 1 :(得分:1)

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

</IfModule>

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

在任何情况下,都可以选择实现'no-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>