子域/子文件夹重定向冲突
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/<something>
。此外,您在该文件中的 mod_alias Redirect
指令实际上不会做任何事情......但如果您实现我上面包含的内容,则不需要它们。我的答案仍然有效,你试过了吗(我已经稍微更新了它以允许www
子子域等)?
好的,我想我明白你的意思了。澄清一点,它没有在多站点上运行。我不确定这是否会有所作为,但我想我应该提一下。我从其中一个子域中删除了 htaccess,并将以下内容添加到主 htaccess 文件gist.github.com/pagetopixel/959c234d9869cb033b6d9801004feba9 我必须仍然缺少某些内容,因为地址栏中的 url 更新但它仍然显示子域的页脚和消息“未找到页面 您点击的链接可能已损坏,或者该页面可能已被删除。”
“它没有在多站点上运行。” - 对不起,以某种方式阅读了一些不存在的东西!它与最后阶段略有不同。但是,第一次重定向有一个小错误。我已经纠正了这一点,并彻底修改/重组了我的答案。我已经在自己的服务器上测试过了,所以原理至少可以正常工作。
工作就像一个魅力!感谢您的所有帮助!以上是关于子域/子文件夹重定向冲突的主要内容,如果未能解决你的问题,请参考以下文章
无法使用httpd-vhosts.conf从子域重定向到子子域