我正在尝试将 www.example.com 重定向到 www.example.org。我不知道我做错了什么。
我已确保在 httpd.conf 中启用了 mod_rewrite:
LoadModule rewrite_module modules/mod_rewrite.so
我通过运行进一步验证了这一点:
httpd -M
并将其 rewrite_module (shared)
包含在结果中。
稍后在同一个 httpd.conf 文件中是 VirtualHost 指令,我试图执行重写:
<VirtualHost *:80>
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.org/$1 [R=301,NC,L]
ServerAdmin [email protected]
DocumentRoot /var/www/html
ServerName example.org
ServerAlias www.example.org *.example.org
<Directory "/var/www/html">
Options Includes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/www/logs/error_log
CustomLog /var/www/logs/access_log common
</VirtualHost>
我们可以看到,我们在目录中遵循了 SymLinks(我认为这是要求),并且我们允许所有覆盖(这满足了另一个要求)。但显然我还是做错了。
你能发现它吗?
答案1
这里有两个问题:
您仅重写
example.com
为www.example.org
,而不是任何其他主机名。我认为您会想要类似以下内容:RewriteCond %{HTTP_HOST} !www.example.org [NC]
您还需要将重写规则放入
<VirtualHost>
您要重定向的主机名的答案中,也就是说,它包含要重定向的主机名的ServerName
和/或条目。ServerAlias
答案2
好吧,在花了几个小时做这件事之后,今天下午我又花了 2 或 3 个小时在这个项目上,然后休息了一会儿,又坐下来做这件事。五分钟后,它就正常工作了。
以下是我在过去几个小时所做的事情:
- 将所有虚拟主机拆分到各自的 /etc/httpd/conf.d/*.conf 文件中
- 将重写功能从 vhost 内部移至网站的 .htaccess 文件中
最后,成功的重写规则(我刚刚调整并成功测试)如下所示(在 .htaccess 内部):
RewriteCond %{HTTP_HOST} www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.org/$1 [L,R=301]
关键要点:
- 始终在重写条件中转义所有句号
- 构建服务器时,第一次就做对。如果将虚拟主机拆分成单独的文件,您的工作将更加轻松。我一直想将此服务器上的每个网站拆分成自己的虚拟主机配置文件,而不是将配置放在 httpd.conf 中。
- 当你想抓狂的时候,不要放弃。检查你的日志并继续测试(我打开了 RewriteLog 指令来帮助我进行故障排除 - 你知道这是 mod_rewrite 中可用的指令吗?是的,我也不知道)。
- 如果使用一种方法不成功,请尝试另一种方法。我不断调整 httpd.conf、.htaccess 和 example.conf 文件。
- 始终清除缓存,并确保在进行更改时重新启动 Apache。我经常这样做。
我很高兴这一切结束了……原本只需 5 分钟的工作变成了 5 小时以上的工作。天哪。