为什么 .htaccess 在 CentOS 7 上不重定向请求?

为什么 .htaccess 在 CentOS 7 上不重定向请求?

运行在 CentOS 7 和 Apache 2.4 上的 Web 应用程序最近将其域名从 更改olddomain.comnewdomain.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

相关内容