WP多站点中的htaccess重定向问题

时间:2021-02-01 作者:Irene

我的网站结构是主网站example.com 和两个子文件夹站点/es//en/

example.com 重定向=>;example.com/es/example.com/en/ 是英文版。

怎么了?

以下内容:

example.com/<non-existing-page> 重定向=>;example.com/es/

这个主重定向的某些部分导致mysite中的每个不存在的页面。com(此站点为空)被重定向到子域中的主页example.com/es/ 而不是得到404错误。我知道问题出在哪里,但我不知道如何修改规则。

中的我的重定向.htaccess 文件:

Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept"
RewriteCond %{ENV:REDIRECT_STATUS} ^$

# Main Redirect

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\\.example\\.com$
RewriteRule ^/?$ "https\\:\\/\\/example\\.com\\/es\\/" [R=301,L]

RewriteCond %{HTTP_HOST} ^example\\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\\.example\\.com$
RewriteRule ^index\\.html$ "https\\:\\/\\/example\\.com\\/es\\/" [R=301,L]

RewriteCond %{HTTP_HOST} ^example\\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\\.example\\.com$
RewriteRule ^indexingles\\.html$ "https\\:\\/\\/example\\.com\\/en\\/" [R=301,L]
适用于以下方面:

这是完美的example.com/index.php 重定向=>;example.com/esindex.html 重定向=>;example.com/esindexingles.html 重定向=>;example.com/en总结

每个具有example.com/<non-existent-page> 重定向到主页:example.com/es/.

一个不存在的页面没有得到404错误是错误的。我必须改变这个,我不知道怎么做。

如果URL为example.com/es/<non-existent-page> 它得到一个404错误,这是正常的。

如果URL为example.com/en/<non-existent-page> 它得到一个404错误,这是正常的。

Note:

如果其他人要使用此重定向,我想补充一点,怀特先生的重定向工作得很好。然而,为了使后端重定向正常工作,我不得不删除Wordfence插件。

1 个回复
最合适的回答,由SO网友:MrWhite 整理而成

每个具有example.com/<non-existent-page> 重定向到主页:example.com/es/.

这大概是WordPress自己做的,因为你发布的内容中没有任何内容(在.htaccess) 就是这样。

您可能需要添加一个额外的;通配符“;重定向到重定向/<anything> (除/es/en) 到/es/<anything>. 例如:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule !^(es|en)($|/) https://example.com/es%{REQUEST_URI} [R=301,L]
这自然也包括根重定向(您的第一条规则)。然而,这个重定向需要在另外两个特定的重定向之后进行,以删除index.htmlindexingles.html 分别地

这个RewriteCond 检查REDIRECT_STATUS 环境变量对于确保只重定向直接请求而不将请求重写到index.php (WP前控制器)。这会阻止重定向循环。这个REDIRECT_STATUS env var未在直接请求上设置,但设置为;200英寸;第一次成功重写后(如“200 OK”HTTP响应状态)。另一种选择是包括index.php 然而,在交替子模式中,这不会规范化直接请求index.php 它本身

无需反斜杠来避开中的斜杠、点和冒号RewriteRule 替换,因为这些字符在这里没有特殊意义。

此外,不需要条件(RewriteCond 指令),除非您有多个域。但即使是这样,也可以简化为一个条件。例如:

RewriteCond %{HTTP_HOST} ^(www\\.)?example\\.com [NC]
您应该首先使用302(临时)重定向进行测试,以避免潜在的缓存问题。只有当您确定这可以正常工作时,才更改为301(永久)。然而,像这样的语言重定向可能是暂时的。

因此,总之,您应该用以下内容替换现有的重定向指令:

RewriteEngine On

# Remove "index.html" and redirect to "/es/"
RewriteRule ^index\\.html$ https://example.com/es/ [R=301,L]

# Remove "indexingles.html" and redirect to "/en/"
RewriteRule ^indexingles\\.html$ https://example.com/en/ [R=301,L]

# Everything else default to "/es/<anything>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule !^(es|en)($|/) https://example.com/es%{REQUEST_URI} [R=301,L]
<小时/>UPDATE: 不起作用的是:https://example.com/wp-admin/network/ 重定向您的次数太多。

我认为您可能需要排除任何以/wp-admin (和/wp-login.php/phpmyadmin) 从上次重定向。将最后一条规则更改为:

# Everything else default to "/es/<anything>"
# With some exceptions...
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule !^(es|en|wp-admin|wp-login\\.php|phpmyadmin)($|/) https://example.com/es%{REQUEST_URI} [R=301,L]
您还可以考虑排除已经映射到物理文件(即。-f). 如果需要更多的排除,则考虑添加其他RewriteCond 而不是指令。例如:

# Everything else default to "/es/<anything>"
# With some exceptions...
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !^/wp-login\\.php$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^(es|en|wp-admin|phpmyadmin)($|/) https://example.com/es%{REQUEST_URI} [R=301,L]
请注意REQUEST_URI 服务器变量在URL路径上包含斜杠前缀,但URL路径与RewriteRule 模式没有。

相关推荐

阻止通过HTAccess访问所有帖子/标签URI

我想阻止访问post/tag/example-here WordPress网站上的页面,但以下内容不起作用。这个.htaccess 正在分析access文件。它位于站点的根(即public_html) 在一个普通的cPanel帐户上。我试过有无前导斜杠。我不明白为什么它不起作用。RewriteCond %{REQUEST_URI} ^post/tag/ RewriteRule .* - [F] # BEGIN WordPress <IfModule mod_r