我们可以使用 htaccess 设置通配符重定向的例外吗?

我们可以使用 htaccess 设置通配符重定向的例外吗?

我在我的一个旧网站中设置了通配符重定向,.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。但在本例中它却出了问题。

相关内容