我有一个以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全部设置之后)。我试过将重写规则放在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>
尝试回答您的问题 :要调试Apache操作,可以将LogLevel调整为较低的级别(也许是debug)。但是,即使您debug为问题模块禁用了日志功能,也不会收到任何消息。例如,默认[RequestLogLevel][2]值为0,例如,模块不写任何消息。我看到您将其设置为3,但是就像RoBorg所说的那样,将其更改9为您的情况可能太低。
debug
[RequestLogLevel][2]
9
解决问题的方法 :尝试使用反格式来更改重写主机名的方式- 查看主机名是否为所需的主机名,如果不是,请将其更改为所需的主机名。就像URL重写指南 -Apache站点上的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]
规范主机名
描述 :此规则的目标是强制使用特定主机名,而不是可能用于访问同一站点的其他主机名。例如,如果您希望强制使用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但您明白了。只需根据您的情况进行调整即可。
example.com
www.example.com