RewriteRule 当替换字符串不是文件路径而是应该由下一个规则处理的 URL 时

Posted

技术标签:

【中文标题】RewriteRule 当替换字符串不是文件路径而是应该由下一个规则处理的 URL 时【英文标题】:RewriteRule when the substitution string is not a file path but an URL which should be processed by next rules 【发布时间】:2021-12-08 06:38:34 【问题描述】:

我想要每个请求

example.com/foo/anything

在被 Wordpress 处理之前被重写为example.com/foo-anything

我试过了:

RewriteEngine On
RewriteRule ^foo/(.*)   foo-$1       # <-- does not work because the subs. string should be a *file path*

# The following is set by Wordpress
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]

但它不起作用,因为替换(目标)字符串应该是文件路径,而不是另一个 URL。

如何制作这样一个RewriteRule,其替换字符串不是文件路径,而是URL,应该由下一个规则处理?

注意事项:

使用RewriteRule ^foo/(.*) foo-$1 [R],它可以工作,但它会导致浏览器重定向和浏览器的 URL 栏中的 URL 更改,这是我不想要的。

我尝试使用RewriteRule flag [PT],即使替换字符串不是文件路径,它也应该可以工作,但它对我不起作用:它不会将/foo/anything 重定向到页面/foo-anything

我试过了

   RewriteRule ^foo/(.*)   index.php?name=foo-$1  [L]

但它只适用于文章,而不适用于页面。我想要一个适用于页面和文章的解决方案。

【问题讨论】:

很确定这是一个 WordPress 问题,至少部分是这样。它解析最初请求的 URL,并且不考虑任何 internal 重写。 (如果是这样,那么整个事情一开始就无法正常工作,因为那样它总是只会看到/index.php,并且不知道它应该基于此显示什么内容。) 如果你使用developer.wordpress.org/reference/functions/add_rewrite_rule进行设置,我想你可能会更幸运 WP 框架不适用于 .htaccess 中的内部重写规则。您必须在主题 php 文件中使用 WP rewrite API。 @CBroe 我之前使用过这个 WP 函数 add_rewrite_rule,但我注意到它最终所做的是它重写了 .htaccess 文件 :) 这个函数 add_rewrite_rule 似乎也有同样的限制:替换字符串必须是文件路径(例如anything.php?query=foo),而不是另一个 URL。问题是:WP如何访问最初请求的URL "WP 如何访问最初请求的 URL?" - 大概是通过 PHP 超全局$_SERVER['REQUEST_URI']。 “我尝试使用 RewriteRule 标志 [PT] 应该可以工作” - 仅在 server 上下文中使用时适用。在.htaccess PT 本质上是默认行为。顺便说一句,在.htaccess 中,子字符串被视为 URL 路径,而不是文件路径(特别是因为定义了 RewriteBase).. 【参考方案1】:

经过一番研究,这似乎是不可能的。

要么是带有 [R] 重定向标志的 RewriteRule,然后浏览器将执行新请求,那么在这种情况下,目标/替换可以是任何新 URL...

...或者它不是重定向RewriteRule,然后目标/替换必须是为请求提供服务的文件。

另见How to use RewriteRule such that $_SERVER['REQUEST_URI'] is modified too for PHP?


在 Wordpress 上下文中,一个(有效的)技巧是使用 .htaccess RewriteRule 而是在 functions.php 中执行此操作:

$_SERVER['REQUEST_URI'] = preg_replace(..., ..., $_SERVER['REQUEST_URI'])

【讨论】:

以上是关于RewriteRule 当替换字符串不是文件路径而是应该由下一个规则处理的 URL 时的主要内容,如果未能解决你的问题,请参考以下文章

在 FOR 循环批处理语法中使用变量进行字符串替换

重写子文件夹而不是主网站的规则

如何在禁止文件上正确应用 RewriteRule?

RewriteRule- 用于选择字符串的正则表达式

电脑系统批处理,如何将多个tab替换为一个tab,而单个的tab不变化?

Nodejs检查给定的字符串是不是是有效的文件系统路径而不实际检查文件系统