每个具有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.html
和
indexingles.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
模式没有。