我们在WordPress .htaccess
中有多个重定向,具体取决于语言。
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.es$
RewriteRule (.*)$ https://www.example.com/es/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^www.example.de$
RewriteRule (.*)$ https://www.example.com/de/$1 [R=301,L]
我们希望排除一些文件夹。我们尝试添加以下示例:
RewriteCond %{REQUEST_URI} !^/folder/
但它不起作用。有人知道怎么做吗?
**更新:**我的完整.htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.es$
RewriteCond %{REQUEST_URI} !^/folder/
RewriteRule (.*)$ https://www.example.com/es/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.fr$
RewriteRule (.*)$ https://www.example.com/fr/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.de$
RewriteRule (.*)$ https://www.example.com/de/$1 [R=301,L]
</IfModule>
# BEGIN WordPress
.....
1条答案
按热度按时间wbrvyc0a1#
但它不起作用。
简单地将一个 * 条件 * 添加到重定向规则在此示例中不起作用,因为......虽然该“文件夹”(URL路径)在重写引擎的第一遍中被排除,WordPress代码块(发生在文件的后面)将请求重写为
index.php
(WordPress前端控制器),它触发重写引擎的第二次传递(其中REQUEST_URI
服务器变量已更新为/index.php
)。然后在第二次传递时发生重定向,因为它不再与^/folder/
匹配。但是,重定向也是到example.com/<lang>/index.php
,而不是最初请求的URL(应该在浏览器的地址栏中看到)。要解决此问题,您可以:
1.修改WordPress代码块,使其不会触发重写引擎的第二次通过。例如,使用
END
标志(需要Apache 2.4+),而不是现有重写的L
。但是,不建议这样做,原因有2:1.您不应该手动编辑
# BEGIN WordPress
和# END WordPress
注解标记之间的代码,因为WP本身管理这一部分(至少它试图这样做,除非您对此进行了限制)。1.为了防止重写循环,您需要注意将来添加到
.htaccess
文件中的任何规则,这并不总是可能的。(有时“循环”是可取的。)或,
REDIRECT_STATUS
环境变量,该变量在初始请求中为 empty。我还假设您要重定向到的子目录总是与所请求域名的TLD相匹配。这是您发布的示例中的情况,但您没有在评论中确认这一点。这意味着您只需要针对所有语言的一个规则,而不是针对每种语言的一个单独的规则。既然您已经确认此文件夹例外应适用于所有语言,那么只使用一个规则是有意义的。
请尝试以下操作(适用于 * 所有 * 语言):
%1
反向引用(与$1
相对)包含在前面的 CondPattern 中匹配的TLD(2字符语言代码)。即es
、fr
或de
。如上所述,
REDIRECT_STATUS
env var确保重定向只发生在初始请求上,而不是重写的请求上。REDIRECT_STATUS
在初始请求上是 * 空 * 的,并在第一次成功重写(到WordPress前端控制器,即/index.php
)后设置为“200”(如200 OK HTTP响应状态)。您不需要重复
RewriteEngine On
指令,因为它已经在文件中 * 稍后 * 出现。您不需要
<IfModule mod_rewrite.c>
Package 器。(如果在多个服务器上使用此代码,我假设此代码不是 * 可选 * 的?)注意:首先用302(临时)重定向进行测试,以避免潜在的缓存问题。在测试之前,您需要清除浏览器。