【发布时间】:2017-09-28 13:31:32
【问题描述】:
我们在 Linux 上运行 Apache 服务器。
在 Apache Config 文件的<VirtualHost> 中(/etc/apach2/sites/site.conf 中),我们有以下重写规则:
此规则的目的是,如果任何人访问该站点(可以通过多个域访问)尝试在前面没有www.的情况下访问,它将301重定向到www.。例如,如果用户访问站点http://example.com,则规则将301 重定向到http://www.example.com。
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^([a-z.]+)$ [NC]
RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
我们在其他服务器上设置了相同的规则并且工作正常,但由于某种原因,我们无法让它在这个新服务器上工作。重启 Apache 就好了等等。但是当我们使用example.com 访问该站点时,它不会重定向到www.example.com。
有什么建议或以前的经验可以提供一些线索吗?
=========
这是上下文配置的扩展版本。
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/site/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
RewriteEngine on
# force www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^([a-z.]+)$ [NC]
RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
# Bypass images, css, javascript and docs, add your own extensions if needed.
RewriteCond %{REQUEST_URI} \.(bmp|gif|jpe?g|png|css|js|txt|pdf|doc|xls|ico)$
RewriteRule ^(.*)$ - [NC,L]
# The ColdBox index.cfm/{path_info} rules.
RewriteRule ^$ index.cfm [QSA,NS]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.cfm/%{REQUEST_URI} [QSA,L,NS]
</Directory>
【问题讨论】:
-
是否启用了 mod_rewrite?只是为了澄清一下,这个指令是否直接在服务器配置(或虚拟主机上下文)中 - 您似乎暗示了这一点?如果是,那么这个指令就不是严格正确的。
-
嗨 w3dk,是的,mod_rewrite 已启用(定义的其他重写工作正常)。该指令位于虚拟主机 > 目录上下文中。
... -
其他重写(正在工作)是否在同一目录上下文中?
FollowSymLinks必须在目录上下文中设置。您的正则表达式不包括连字符,所以大概您的域名不包含连字符?什么版本的阿帕奇?您是否启用了调试?检查HTTP_HOST的值(例如,分配给环境变量并签入您的代码)。 -
谢谢!我已经在那里粘贴了完整的上下文。FollowSymlinks 在那里,但是在一个单独的目录容器中。不确定这是否会有所作为。我已经用完整的上下文更新了原始帖子。 Apache 是版本 2.4.7 (Ubuntu).. 不确定如何启用调试.. 将对此进行调查.. 再次感谢!!
-
我已经按照你的建议添加了 RewriteRule .. 这似乎重写得很好。 119.9.30.242/foo 改写为“119.9.30.242/bar?host=119.9.30.242”.. 这个改写就在 www 改写的正下方.. 谢谢!!
标签: apache mod-rewrite http-status-code-301