如何重定向匹配完整的子域 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(RedirectRedirectMatch ) 将始终 运行,即使较早的 mod_rewrite 指令 (RewriteRule) 可能已重写 URL 并停止执行。