如何重定向匹配完整的子域 url,但使用 htaccess 使根子域转到其他地方
How can I redirect match full subdomain urls, but make the root subdomain go elsewhere using htaccess
我有一堆来自子域的旧 url,我需要重定向到另一个子域并保留 url 模式。我正在努力解决的问题是让根子域重定向到另一个位置。
对于上下文,这是旧 url 结构的示例:
https://oldsub.maindomain.com/2015/07/30/url-title/
我需要重定向到:
https://blog.maindomain.com/blog/2015/07/30/url-title/
请注意,它需要指向一个新的 blog
子域,并且在主域之后添加了一个 blog
slug。
如果有人只访问旧子域的根 (https://oldsub.maindomain.com/
),我需要将其重定向到主域 (https://maindomain.com/specific-url-title/
)[=24= 上的 URL 结构]
我的 .htaccess
在子域目录的根目录中。
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^oldsub\. [NC]
RewriteCond %{HTTP_HOST} ^(?:oldsub\.)?(.+)$ [NC]
RewriteRule ^ https://blog.%1%{REQUEST_URI} [L,NE,R=301]
RewriteCond %{HTTP_HOST} ^oldsub\.maindomain\.com$ [NC]
RewriteRule ^ https://maindomain.com/specific-url-title/ [L,NE,R=301]
在根域的 .htaccess
中我有:
RewriteCond %{HTTP_HOST}
RedirectMatch 301 ^/blog/(.*)$ https://blog.maindomain.com/blog/
所以旧的博客帖子正确重定向到 blog.maindomain.com/blog/rest-of-url
但最后两行不起作用,因为旧的子域请求也简单地转到 blog.maindomain.com/blog
。
文件结构为:
/public_html (maindomain.com)
.htaccess
/oldsub.maindomain.com (oldsub.maindomain.com)
.htaccess
blog.maindomain.com
住在另一台服务器上(在 hubspot 平台上)
您当前的重定向不正确,因此需要修复这些问题。 (尽管您应该已经看到某种重定向。)
RewriteCond %{HTTP_HOST} ^oldsub\. [NC]
RewriteCond %{HTTP_HOST} ^(?:oldsub\.)?(.+)$ [NC]
RewriteRule ^ https://blog.%1%{REQUEST_URI} [L,NE,R=301]
RewriteCond %{HTTP_HOST} ^oldsub\.gppcpa\.com$ [NC]
RewriteRule ^ https://maindomain.com/specific-url-title/ [L,NE,R=301]
这些指令的问题:
第一条规则不重定向到 /blog
子目录。
这些规则冲突。第一条规则还将重定向子域的文档根目录。因此,第二条规则将永远不会被处理。
由于有问题的子域完全在您的主域之外,就这些主机名在您的文件系统上的位置而言,因此无需检查这些指令中的主机名,因为只有 oldsub
子域可以访问这个区域。
请尝试以下操作:
RewriteRule . https://blog.maindomain.com/blog%{REQUEST_URI} [R=302,L]
RewriteRule ^ https://maindomain.com/specific-url-title/ [R=302,L]
第一个 RewriteRule
模式中的单点匹配“某物”(而不是“无”)。当 URL-path 为空(即文档根目录)时,这会落入第二个指令。
确保在测试前清除浏览器缓存。
使用 302(临时)重定向进行测试,只有在您确定它工作正常时才更改为 301(永久)。这是为了避免任何缓存问题,因为 301 会被浏览器持久缓存(包括那些错误生成的)。
RewriteCond %{HTTP_HOST}
RedirectMatch 301 ^/blog/(.*)$ https://blog.maindomain.com/blog/
来自您的主域 .htaccess
文件...此处的 RewriteCond
指令是错误的,应将其删除。
为避免与 mod_rewrite 的潜在冲突,您应该将 mod_alias RedirectMatch
指令更改为 mod_rewrite。例如:
RewriteEngine On
RewriteRule ^blog/(.*) https://blog.maindomain.com/blog/ [R=302,L]
不同的 Apache 模块(mod_rewrite、mod_alias 等)运行 在整个请求的不同时间 运行 相互独立。 mod_rewrite 通常首先是 运行(不管配置文件中指令的明显顺序如何),但这也意味着 mod_alias(Redirect
、RedirectMatch
) 将始终 运行,即使较早的 mod_rewrite 指令 (RewriteRule
) 可能已重写 URL 并停止执行。
我有一堆来自子域的旧 url,我需要重定向到另一个子域并保留 url 模式。我正在努力解决的问题是让根子域重定向到另一个位置。
对于上下文,这是旧 url 结构的示例:
https://oldsub.maindomain.com/2015/07/30/url-title/
我需要重定向到:
https://blog.maindomain.com/blog/2015/07/30/url-title/
请注意,它需要指向一个新的 blog
子域,并且在主域之后添加了一个 blog
slug。
如果有人只访问旧子域的根 (https://oldsub.maindomain.com/
),我需要将其重定向到主域 (https://maindomain.com/specific-url-title/
)[=24= 上的 URL 结构]
我的 .htaccess
在子域目录的根目录中。
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^oldsub\. [NC]
RewriteCond %{HTTP_HOST} ^(?:oldsub\.)?(.+)$ [NC]
RewriteRule ^ https://blog.%1%{REQUEST_URI} [L,NE,R=301]
RewriteCond %{HTTP_HOST} ^oldsub\.maindomain\.com$ [NC]
RewriteRule ^ https://maindomain.com/specific-url-title/ [L,NE,R=301]
在根域的 .htaccess
中我有:
RewriteCond %{HTTP_HOST}
RedirectMatch 301 ^/blog/(.*)$ https://blog.maindomain.com/blog/
所以旧的博客帖子正确重定向到 blog.maindomain.com/blog/rest-of-url
但最后两行不起作用,因为旧的子域请求也简单地转到 blog.maindomain.com/blog
。
文件结构为:
/public_html (maindomain.com)
.htaccess
/oldsub.maindomain.com (oldsub.maindomain.com)
.htaccess
blog.maindomain.com
住在另一台服务器上(在 hubspot 平台上)
您当前的重定向不正确,因此需要修复这些问题。 (尽管您应该已经看到某种重定向。)
RewriteCond %{HTTP_HOST} ^oldsub\. [NC] RewriteCond %{HTTP_HOST} ^(?:oldsub\.)?(.+)$ [NC] RewriteRule ^ https://blog.%1%{REQUEST_URI} [L,NE,R=301] RewriteCond %{HTTP_HOST} ^oldsub\.gppcpa\.com$ [NC] RewriteRule ^ https://maindomain.com/specific-url-title/ [L,NE,R=301]
这些指令的问题:
第一条规则不重定向到
/blog
子目录。这些规则冲突。第一条规则还将重定向子域的文档根目录。因此,第二条规则将永远不会被处理。
由于有问题的子域完全在您的主域之外,就这些主机名在您的文件系统上的位置而言,因此无需检查这些指令中的主机名,因为只有 oldsub
子域可以访问这个区域。
请尝试以下操作:
RewriteRule . https://blog.maindomain.com/blog%{REQUEST_URI} [R=302,L]
RewriteRule ^ https://maindomain.com/specific-url-title/ [R=302,L]
第一个 RewriteRule
模式中的单点匹配“某物”(而不是“无”)。当 URL-path 为空(即文档根目录)时,这会落入第二个指令。
确保在测试前清除浏览器缓存。
使用 302(临时)重定向进行测试,只有在您确定它工作正常时才更改为 301(永久)。这是为了避免任何缓存问题,因为 301 会被浏览器持久缓存(包括那些错误生成的)。
RewriteCond %{HTTP_HOST} RedirectMatch 301 ^/blog/(.*)$ https://blog.maindomain.com/blog/
来自您的主域 .htaccess
文件...此处的 RewriteCond
指令是错误的,应将其删除。
为避免与 mod_rewrite 的潜在冲突,您应该将 mod_alias RedirectMatch
指令更改为 mod_rewrite。例如:
RewriteEngine On
RewriteRule ^blog/(.*) https://blog.maindomain.com/blog/ [R=302,L]
不同的 Apache 模块(mod_rewrite、mod_alias 等)运行 在整个请求的不同时间 运行 相互独立。 mod_rewrite 通常首先是 运行(不管配置文件中指令的明显顺序如何),但这也意味着 mod_alias(Redirect
、RedirectMatch
) 将始终 运行,即使较早的 mod_rewrite 指令 (RewriteRule
) 可能已重写 URL 并停止执行。