Subdomain/subfolder 重定向冲突

Subdomain/subfolder redirect conflict

我们有很多网站是子域。我们正在改变这些站点的结构,使它们成为一个站点,而不是多个 WordPress 安装。没问题。许多子域都具有权限,因此我们希望将这些子域的 301 重定向添加到新的相应页面。但是,新页面父页面 URLs 与旧子域结构冲突。

现有子域

sub1.example.com

现在是登陆页面的重定向。

example.com/sub1

存在冲突,因为子域文件夹需要保留在原位才能执行重定向。

我正在寻找一种在 .htaccess 中从子域创建重定向的方法,该子域与同名的新页面 URL 不冲突?

it is preferred to leave the folders in tact so we can add 301 redirects to the .htaccess files in these folders

这是问题的一部分。这些子目录中的任何 .htaccess 文件将覆盖父目录中的 .htaccess 文件(我假设的主要 WP 指令)。 (严格来说只是mod_rewrite指令被覆盖,其他模块被继承。)

改为尝试以下操作:

(注意:这假定子域指向主域文档根目录之外的相应子目录。如果您更改子域,它会更简单,这样它也指向主站点的文档根目录。然后您将只需要一个(更简单的)重定向。)

  1. 删除子目录中的 .htaccess(和 index.php)文件,而是在父 .htaccess 文件中添加适当的指令。

  2. 靠近根 .htaccess 文件的顶部(在任何现有的 WP 指令之前):

    RewriteCond %{HTTP_HOST} ^(?:www\.)?(sub1|sub2|sub3)\.example\.com
    RewriteRule ^[^/]+/(.*) http://example.com/%1/ [R=302,L]
    

    这会将 sub1.example.com/<anything> 重定向到 http://example.com/sub1/<anything>。初始请求中的 www 子域是可选的。

    具体如何执行此操作可能取决于您拥有的子域数量(以及格式)。如果你只有少数(你说你有 3 个),那么最好明确命名这些,如上面的 RewriteCond 指令。

    在测试时使用 302(临时)重定向更容易,因为它们不会被浏览器缓存。 (确保在测试前清除浏览器缓存。)

  3. 您将需要更新主要的 WordPress 指令以包含额外的 rule/condition 用于访问这些裸子目录(例如 http://example.com/sub1/)。由于 /sub1 是物理目录,WP 不会路由请求,因为 WordPress 前端控制器特别忽略现有文件和目录。

    在主 WP .htaccess 文件中,您有以下指令:

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress
    

    在上述之后立即添加以下规则:

    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^(sub1|sub2|sub3)/?$ /index.php [L]
    

    这允许 WordPress 路由对裸子目录(例如 http://example.com/sub1/)的请求。