如果要从/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被浏览器硬缓存,因此可能会导致测试出现问题。