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

Myr*_*ton 7 apache mod-rewrite tomcat

我有一个运行apache httpd作为前端的tomcat 6 web应用程序.我正在使用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>
Run Code Online (Sandbox Code Playgroud)

编辑:下面的回复对我的特定情况有帮助,但可能对整个社区没有帮助,因为答案是关于如何解决apache指令的一般问题.例如,有没有办法启用日志记录,它会告诉我在请求进入时以哪种顺序应用哪些指令?

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

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

Leo*_*ins 4

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

尝试解决您的问题:尝试更改使用相反形式重写主机名的方式 - 查看主机名是否是您想要的,如果不是,请将其更改为您想要的主机名。正如Apache 站点的URL 重写指南 - 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]
Run Code Online (Sandbox Code Playgroud)

在他们的例子中,他们从 改为 ,example.comwww.example.com你明白了。只需根据您的情况进行调整即可。