如果要从/2016/<anything>
到/2016/a/<anything>
, 然后,您可以在现有WordPress指令之前执行以下操作(即# BEGIN WordPress
) 在您的/2016/.htaccess
文件:
RewriteCond %{REQUEST_URI} ^/(\\d{4})/(.*)
RewriteRule !^a/ /%1/a/%2 [R,L]
被否定的
RewriteRule
模式防止在URl路径已以开始时发生重定向
a/
(相对于
/2016/
目录)。这个
%1
和
%2
反向参考指回匹配的CondPattern。
请注意,由于这是一个外部重定向,因此/a
子目录自然会向用户公开。(如果您在内部链接到/a
子目录,则无论如何它都会公开。)
或者,如果要在内部重写/2016/<anything>
到/2016/a/<anything>
, 从而隐藏/a
子目录(用户只能看到/2016/<anything>
) 然后您可以执行以下操作:
RewriteCond %(ENV:REDIRECT_STATUS) ^$
RewriteRule (.*) a/$1 [L]
The
RewriteCond
检查
REDIRECT_STATUS
环境变量确保这只应用于初始请求,而不是重写的请求,以防止重写循环。
请注意,无论是否/a
在最初的请求中已经存在。例如,请求/2016/a/<something>
将内部重写为/2016/a/a/<something>
(我想这可能会导致404)。但如果目的是隐藏/a
子目录,然后/a
一开始就不应该出现在请求中。
同样,这必须在现有WordPress指令之前进行。除非删除这些指令,否则无法访问WordPress网站。
如果表单的URL/2016/a/<something>
已被外部第三方索引或链接,则还应考虑包括重定向以删除/a
URL的子目录(以保留SEO)。例如,在上述重写之前,需要执行以下操作:
RewriteCond %(ENV:REDIRECT_STATUS) ^$
RewriteCond %{REQUEST_URI} ^/(\\d{4})
RewriteRule ^a/(.*) /%1/$1 [R,L]
The
%1
backreference指的是目录名,即“2016”(在前面的CondPattern中捕获)-这只需在替换中手动硬编码目录名即可。
$1
是对后面所有内容的反向引用
/2016/a/
在URL路径中。
请注意,上述“重定向”(由R
上的标志RewriteRule
) 是临时(302)重定向。如果这些是永久性的,则更改R
到R=301
, 但只有在你确认它工作正常后。301s被浏览器硬缓存,因此可能会导致测试出现问题。