重定向不起作用,它们的规则或顺序是否有冲突?

时间:2019-11-30 20:53:18

标签: apache .htaccess redirect mod-rewrite

我需要将不是www或https的所有传入流量重定向到www和https。 一个问题是尝试添加另一条规则,该规则将处理曾经位于rootdomain.com/blog/rest-of-url-title的所有流量,并将其发送到子域https://blog.rootdomain.com/rest-of-url-title

这是我在根域htaccess中拥有的

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^/blog/(.*)$ https://blog.rootdomain.com/$1 [R=302,L]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=302]
</IfModule>

然后在博客子域目录htaccess中,我具有此功能(将任何非https重定向到https,其余基于Wordpress)

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

当尝试访问任何rootroot.com/blog/rest-of-url-title的URL时,它将重定向到 https://www.rootdomain.com/index.php

它不会重定向到Blog子域,而是转到www,因为www的URL标题不存在,所以我得到404。

1 个答案:

答案 0 :(得分:0)

我必须使用mod_alias redirectmatch才能使其按我想要的方式工作

RedirectMatch 302 ^/blog/(.*)$ https://blog.rootdomain.com/$1

这很奇怪,因为我在根目录下原始htaccess中的mod_rewrite行具有以下内容:

RewriteRule ^blog/(.*) https://blog.rootdomain.com/$1 [R=302,L]

在该特定服务器上不起作用,但在我测试过的任何其他服务器上都能正常工作。也许是因为子域/目录映射问题?

无论如何,我知道将mod_rewrite和mod_alias混合使用并不是一种好习惯,这个最终结果对我有用:

RedirectMatch 302 ^/blog/(.*)$ https://blog.skodaminotti.com/$1
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=302]
</IfModule>

如果有人知道改写为什么行不通的话,仍然会很乐意。