【发布时间】: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