我在我的一个旧网站中设置了通配符重定向,.htaccess
它将所有请求重定向到新域名上的同一页面:
#Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
我希望旧域名的主页重定向到新域名上的特定页面。所以我在通配符重定向规则顶部添加了此行
#Options +FollowSymLinks
RewriteEngine on
Redirect 301 / https://example.com/specific-page/
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
但它不起作用。你能解释一下我哪里出错了吗?
我通过这个工具测试过https://htaccess.madewithlove.be/这表明我的规则没有问题。
答案1
Redirect
(mod_alias) 和RewriteRule
(mod_rewrite) 属于不同的 Apache 模块,因此在请求期间独立运行且在不同时间运行。在 Apache 上,Redirect
实际运行后 RewriteRule
,尽管配置文件中的顺序明显不同。
因此,在您发布的指令中,RewriteRule
重定向实际上是“获胜”并且重定向请求,因为它首先被处理。
Redirect 301 / https://example.com/specific-page/
mod_aliasRedirect
指令也是前缀匹配的,因此诸如/
(单个斜杠)之类的源 URL 实际上会匹配一切,而不仅仅是对文档根目录(主页)的请求。匹配后的所有内容都会复制到目标 URL 的末尾。因此上述指令将重定向/<something>
到https://example.com/specific-page/<something>
。
要重定向具体的URL 到不同的位置,您需要在更通用的重定向之前添加一个完全独立的规则。
例如:
RewriteEngine on
# Redirect the document root (homepage) only
RewriteRule ^$ https://example.com/specific-page/ [R=301,L]
# Redirect everything else
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
更新:请注意,^$
(空字符串)/
仅与请求的 URL 路径(单个斜杠)匹配。在每个目录配置(即.htaccess
)中,RewriteRule
匹配 URL 路径减去斜杠前缀。(严格来说,它匹配 URL 路径减去目录前缀,目录前缀是文件本身的位置.htaccess
,并且始终以斜杠结尾。)
测试前您需要清除浏览器缓存。建议先使用 302(临时)重定向进行测试,以避免缓存问题。
#Options +FollowSymLinks
FollowSymLinks
是 mod_rewrite 运行所必需的,但这可能已经在您的服务器配置中启用。
我通过这个工具测试过https://htaccess.madewithlove.be/这表明我的规则没有问题。
该工具主要用于测试 mod_rewrite。但在本例中它却出了问题。