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 时的主要内容,如果未能解决你的问题,请参考以下文章