运行在 CentOS 7 和 Apache 2.4 上的 Web 应用程序最近将其域名从 更改olddomain.com
为newdomain.com
。的应用程序结构newdomain.com
与 的不同olddomain.com
,因此来自 的所有请求都olddomain.com/anyurl
需要重定向到根 url newdomain.com
。
.htaccess
创建了一个新文件并httpd
重新启动,那么为什么请求olddomain.com/testbadurl
无法重定向到newdomain.com
? 相反,用户只会在 处收到 404 错误olddomain.com/testbadurl
。
以下是在命令行中执行的步骤:
# nano /etc/httpd/conf/httpd.conf
<Directory "/var/www/html">
AllowOverride All
</Directory>
# sudo systemctl restart httpd
# cd /var/www/html
# nano /var/www/html/.htaccess
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^olddomain\.com$ [NC]
RewriteRule ^(.*)$ http://newdomain.com [R=301,L]
# systemctl restart httpd
然后测试用户olddomain.com/testbadlink
在 Web 浏览器中键入。日志nano /var/log/httpd/olddomain_com_requests.log
显示 a 404 error
。
回答:
@garethTheRed 让我思考文件VirtualHost
中的指令httpd
conf
,这最终导致我制定了以下答案,该答案有效并且现在解决了问题:
<VirtualHost www.olddomain.com:80>
ServerName www.olddomain.com
ServerAlias olddomain.com
ErrorLog /var/log/httpd/olddomain_com_error.log
CustomLog /var/log/httpd/olddomain_com_requests.log combined
RedirectMatch ^(.*)$ http://newdomain.com
</VirtualHost>
httpd
conf
请注意,让文件执行此操作比允许外部访问文件更安全.htaccess
。
答案1
我要把我的头放在栏杆上方并给出这个答案 - 毕竟,答案是可以删除的!
Apache 以不太明确定义的顺序处理其模块。您可以通过以下方式查看处理订单使能该mod_info
模块。在 Fedora 22 安装中,出现以下内容(完整):
Post-Read Request:
-10 mod_http2.c
00 mod_headers.c
00 mod_remoteip.c
00 mod_proxy.c
10 mod_auth_digest.c
10 mod_http2.c
10 mod_reqtimeout.c
10 mod_setenvif.c
10 mod_unique_id.c
Header Parse:
10 mod_setenvif.c
HTTP Scheme:
30 http_core.c
Default Port:
30 http_core.c
Quick Handler:
00 mod_cache.c
00 mod_lua.c
Translate Name:
-1 mod_lua.c
00 mod_rewrite.c
00 mod_proxy.c
00 mod_proxy_express.c
10 mod_alias.c
10 mod_userdir.c
10 mod_vhost_alias.c
10 mod_lua.c
21 mod_lua.c
30 core.c
您会注意到它mod_proxy.c
位于列表的第一位。
我(非常有限)的理解是,您的代理设置将首先被处理,此时您的 WAR 文件将被返回,因此重写永远不会被应用。
有多种方法可以仅使用mod_rewrite
和[P]
标志进行代理,如 apache 文档中所述这里。在这种情况下它可能很有用。
答案2
您需要启用模块“重写”才能使 .hataccess 正常工作:
a2enmod rewrite
service httpd restart