htaccess 中首页的 RewriteRule(反向代理)不起作用

htaccess 中首页的 RewriteRule(反向代理)不起作用

以下规则应以我的首页(WordPress)为目标,以提供不同的页面。

RewriteCond %{HTTP_HOST} ^example.com$
RewriteCond %{REQUEST_URI}  ^($|\/$|\?|\/\?)
RewriteRule ^(.*) https://yy.example.com [P]

所以https://example.com应该https://yy.example.com在幕后服务。

我也对其他几个子网站也这样做,例如:

RewriteCond %{HTTP_HOST} ^example.com$
RewriteCond %{REQUEST_URI}  ^/zzz($|\/$|\?|\/\?)
RewriteRule ^(.*) https://yy.example.com/zzz [P]

它成功地处理了https://yy.example.com/zzz上的请求https://example.com/zzz。这只需要针对特定​​的 URL 执行,而不需要针对整个域执行。

然而,头版的第一条规则却不起作用。

如果我改用[L,R=301],它会重定向到,https://yy.example.com这样 才能RewriteCond正常工作。但出于某种原因,只有在首页上,RewriteRule才能与 一起使用,[P]而 则可以与 一起使用[L,R]

原因可能是什么?首页是否需要添加任何特定内容?WordPress 是否以某种方式干扰了这一点?重写规则位于文件的最顶部.htaccess,因此没有先前的规则干扰了这一点。另请注意,[R]工作也表明此规则实际上已达到但在使用[P]指令时未正确执行。

更新: 以下规则(由 MrWhite 提出)可以正确重定向首页:

RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^index\.php$ https://yy.example.com/ [P]

但是,由于 Wordpress 正在运行,它也会重定向任何其他 Wordpress 页面,因为据我所知,Wordpress 会重写任何“不存在”的路径(由于漂亮的链接,如https://example.com/zzz) 到 index.php,然后它使用此默认的 Wordpress 指令来处理要显示哪个页面。

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

所以,感谢 MrWhite,我们已经很接近目标了,但是还没有完全到达。

另一更新: 通过将 Wordpress 的索引文件重命名为index-wp.php并调整规则来修复 Wordpress 重定向:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index-wp.php [L]

因此,我有效地使用 MrWhite 的更新规则在首页(index.php)上转发访问,然后我使用上述规则过滤几个 /zzz 子页面,然后其他所有内容都转发到实际的服务器路径或 Wordpress(index-wp.php),使用最后的规则。

- - 解决了 - -

答案1

Wordpress的index.php位于根目录。

index.php在 mod_rewrite/mod_proxy 捕获请求之前,mod_dir 可能正在发出目录索引的内部子请求(即),在这种情况下您的指令将不匹配。但是,您的指令还存在其他问题...

RewriteCond %{HTTP_HOST} ^example.com$
RewriteCond %{REQUEST_URI}  ^($|\/$|\?|\/\?)
RewriteRule ^(.*) https://yy.example.com [P]

代换字符串中主机名后面缺少一个斜杠。某物需要附加此内容才能发出有效的 HTTP 请求。在外部重定向的情况下,浏览器有效地在此处附加尾部斜杠。

条件模式 ^($|\/$|\?|\/\?)过于复杂,匹配过多。它只会匹配第二个交替段(即\/$)——如果有的话。REQUEST_URI变量总是以斜杠开头,不包含查询字符串。这里也不需要对斜杠进行反斜杠转义(没有正则表达式分隔符)。但是,此RewriteCond指令不是必需的 - 您可以在RewriteRule 图案- 这也将更加高效。

请尝试以下操作:

RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(index\.php)?$ https://yy.example.com/ [P]

RewriteRule 图案 ^(index\.php)?$匹配//index.php

答案2

我已经用仅包含以下内容的 .htaccess 进行了测试

RewriteRule ^ "/info.php?orig=%{REQUEST_URI}" [P]

当我请求http://本地主机/,REQUEST_URI 包含“/index.html”,这当然不符合你的第二个 RewriteCond。

相关内容