.htaccess 301 重定向整个 URL 包括域

.htaccess 301 redirect whole URL including Domain

我需要在多域站点上重定向大约 300 URL 秒,该站点在不同域上具有相同的 URL 结构。例如:

https://www.example.com/de/products.html 需要重定向到 https://www.example.org/de/products.html

所以我通常的方法不起作用:

RedirectMatch 301 /de/products.html$ /de/products.html

我需要类似的东西

RedirectMatch 301 https://www.example.com/de/products.html$ https://www.example.org/de/products.html

这显然行不通,或者我只是没有开始工作。

不确定是否重要,但它是一个 TYPO3 实例。

mod_alias RedirectMatch 指令仅匹配 URL-path。要匹配主机名,您需要使用 mod_rewrite 和一个额外的 conditionRewriteCond 指令)来检查 HTTP_HOST 服务器变量( Host HTTP 请求的值 header).

此外,由于 URL 结构在两个域上相同,因此您只需要一个规则 - 只需使用与初始请求相同的 URL-path。无需像您尝试的那样进行 one-by-one 重定向。

例如,在 任何现有重写之前,以下内容需要位于 .htaccess 文件的顶部

RewriteEngine On

# Redirect everything from example.com to example.org and preserve the URL-path
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com [NC]
RewriteRule ^ https://www.example.org%{REQUEST_URI} [R=301,L]

这会检查 example.comwww.example.com

REQUEST_URI 服务器变量已经包含斜杠前缀,因此在 替换 字符串中被省略。

首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。


更新:

But I don't want to redirect all URLs, just some.

要将特定 URL 重定向到目标域中的相同 URL,请按照您的原始示例:

# Redirect "/de/product.html" only
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com [NC]
RewriteRule ^de/products\.html$ https://www.example.org/[=11=] [R=301,L]

以上仅将 https://www.example.com/de/products.html 重定向到 https://www.example.org/de/products.html

[=23=] 反向引用包含 RewriteRule 模式 匹配的整个 URL-path。

How to extend your snippet with /de/ or /fr/ etc.? For example I want to redirect example.com/de/products.html but not example.com/products.html

也许上面的例子就是您所需要的。或者,要仅重定向 /de/<something>(或 /fr/<something>)而不仅仅是 /<something>,您可以这样做:

# Redirect "/<lang>/<something>" only, where <lang> is "de" or "fr"
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com [NC]
RewriteRule ^(de|fr)/[^/]+$ https://www.example.org/[=12=] [R=301,L]

以上将https://example.com/de/<something>重定向到https://www.example.org/de/<something>