子域/子文件夹重定向冲突

Posted

技术标签:

【中文标题】子域/子文件夹重定向冲突【英文标题】:Subdomain/subfolder redirect conflict 【发布时间】:2017-09-05 23:39:42 【问题描述】:

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

现有子域

sub1.example.com

重定向现在是一个登陆页面。

example.com/sub1

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

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

【问题讨论】:

“存在冲突,因为子域文件夹需要保留在原位才能执行重定向。” - 不确定你在这里指的是什么“冲突”?子域仍然需要在 DNS 中进行配置,但如果需要,可以将其更改为指向文件系统的另一部分(但我不确定您是否需要)? 感谢您的回复。对不起,我应该更清楚,我在这方面有点不稳定。在访问新的父页面 site.com/sub1 时,它会在访问子文件夹时生成 404 错误。本质上我需要它,所以当有人找到 sub1.site.com 时,它会重定向到名为 site.com/sub1 的新页面。但似乎服务器将子文件夹和新页面视为相同并且不知道该怎么做。所以我需要 RewriteCond 方面的帮助。 嗯好的,/sub1是WP中定义的URL,所以需要通过WP进行路由。但是如果有一个名为/sub1(子域的原始目标)的物理目录,那么 WP 将无法路由该 URL(这是因为 WP 自己的 mod_rewrite 指令)。文件系统上的/sub1 目录是否需要 存在?您不能更改子域,使其仅指向主站点的文档根目录吗?否则我们可以更改 WP 指令,以允许路由这些 URL? 再次感谢。是的,最好保留文件夹,以便我们可以将 301 重定向添加到这些文件夹中的 .htaccess 文件,这样我们就可以尝试保留页面当前拥有的任何权限。虽然我绝对愿意接受建议。 【参考方案1】:

最好保留文件夹,以便我们可以将 301 重定向添加到这些文件夹中的 .htaccess 文件

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

请尝试以下方法:

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

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

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

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

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

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

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

    您将需要更新主要的 WordPress 指令,以在访问这些裸子目录时包含额外的规则/条件(例如,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/)的请求。

【讨论】:

有 3 个子域。这是我正在测试的子域之一的示例。 gist.github.com/pagetopixel/6f9e821880abe43568f40ecb6e657ecb 当我提到发布您现有的.htaccess 文件时,我指的是文档根目录中的主要.htaccess 文件(用于 WordPress 多站点)。链接的子域的.htaccess 文件似乎只重定向裸子域,即。 sub1.example.com/ 而不是 sub1.example.com/&lt;something&gt;。此外,您在该文件中的 mod_alias Redirect 指令实际上不会做任何事情......但如果您实现我上面包含的内容,则不需要它们。我的答案仍然有效,你试过了吗(我已经稍微更新了它以允许www 子子域等)? 好的,我想我明白你的意思了。澄清一点,它没有在多站点上运行。我不确定这是否会有所作为,但我想我应该提一下。我从其中一个子域中删除了 htaccess,并将以下内容添加到主 htaccess 文件gist.github.com/pagetopixel/959c234d9869cb033b6d9801004feba9 我必须仍然缺少某些内容,因为地址栏中的 url 更新但它仍然显示子域的页脚和消息“未找到页面 您点击的链接可能已损坏,或者该页面可能已被删除。” “它没有在多站点上运行。” - 对不起,以某种方式阅读了一些不存在的东西!它与最后阶段略有不同。但是,第一次重定向有一个小错误。我已经纠正了这一点,并彻底修改/重组了我的答案。我已经在自己的服务器上测试过了,所以原理至少可以正常工作。 工作就像一个魅力!感谢您的所有帮助!

以上是关于子域/子文件夹重定向冲突的主要内容,如果未能解决你的问题,请参考以下文章

无法使用httpd-vhosts.conf从子域重定向到子子域

.htaccess 如何仅将子域/文件夹重定向到子域

子域正在重定向到主域文件

内部子域到文件夹重定向

在通配符 vhost apache (xampp) 设置中重定向子子域

.htaccess - 将子域重定向到文件夹