我希望每个请求
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。
如何制作这样一个rewriterrule,其中替换字符串不是文件路径,而是URL,应该由下一个规则处理?
指出:
使用
RewriteRule ^foo/(.*) foo-$1 [R]
,它可以工作,但它会导致浏览器重定向和浏览器URL栏中的URL更改,这是我不想要的。我尝试了RewriteRule标志
[PT]
,即使替换字符串不是文件路径,也应该工作,但它不适合我:它不会将/foo/anything
重定向到/foo-anything
页。我试着
RewriteRule ^foo/(.*) index.php?name=foo-$1 [L]
,但它只适用于文章,而不适用于页面。我想要一个同时适用于页面和文章的解决方案。
经过一番研究,这似乎是不可能的。
要么是带有[R]重定向标志的rewriterrule,然后浏览器会做一个新的请求,那么在这种情况下,目标/替代可以是任何新的URL…
…或者不是一个重定向rewriterrule,然后目标/替换必须是一个服务于请求的文件。
参见如何使用RewriteRule使$_SERVER['REQUEST_URI']也被修改为PHP?
在Wordpress上下文中,一个(有效的)hack是不使用。htaccess重写规则,而是在functions.php
:
$_SERVER['REQUEST_URI'] = preg_replace(..., ..., $_SERVER['REQUEST_URI'])