.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 和一个额外的 condition(RewriteCond
指令)来检查 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.com
和 www.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>
。
我需要在多域站点上重定向大约 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 和一个额外的 condition(RewriteCond
指令)来检查 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.com
和 www.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 redirectexample.com/de/products.html
but notexample.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>
。