使用WordPress在.htaccess中排除域重定向中的文件夹

bxpogfeg  于 2022-11-16  发布在  WordPress
关注(0)|答案(1)|浏览(174)

我们在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
.....
wbrvyc0a

wbrvyc0a1#

RewriteCond %{REQUEST_URI} !^/folder/

但它不起作用。
简单地将一个 * 条件 * 添加到重定向规则在此示例中不起作用,因为......虽然该“文件夹”(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相匹配。这是您发布的示例中的情况,但您没有在评论中确认这一点。这意味着您只需要针对所有语言的一个规则,而不是针对每种语言的一个单独的规则。既然您已经确认此文件夹例外应适用于所有语言,那么只使用一个规则是有意义的。
请尝试以下操作(适用于 * 所有 * 语言):

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !^/folder/
RewriteCond %{HTTP_HOST} ^(www\.)?example\.([a-z]{2}).?$
RewriteRule (.*) https://www.example.com/%1/$1 [R=301,L]

%1反向引用(与$1相对)包含在前面的 CondPattern 中匹配的TLD(2字符语言代码)。即esfrde
如上所述,REDIRECT_STATUS env var确保重定向只发生在初始请求上,而不是重写的请求上。REDIRECT_STATUS在初始请求上是 * 空 * 的,并在第一次成功重写(到WordPress前端控制器,即/index.php)后设置为“200”(如200 OK HTTP响应状态)。
您不需要重复RewriteEngine On指令,因为它已经在文件中 * 稍后 * 出现。
您不需要<IfModule mod_rewrite.c> Package 器。(如果在多个服务器上使用此代码,我假设此代码不是 * 可选 * 的?)
注意:首先用302(临时)重定向进行测试,以避免潜在的缓存问题。在测试之前,您需要清除浏览器。

相关问题