使用htaccess将WordPress重定向到子文件夹中的静态网站

时间:2018-04-12 作者:ivanacorovic

我使用简单的静态插件创建了我的WP网站的静态副本。所有文件都在/2016/, 静态副本位于/2016/a/. 我应该添加什么.htaccess 为了使WP从example.com/2016example.com/2016/a?

这是我现在的.htaccess:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /2016/
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /2016/index.php [L]
</IfModule>
# END WordPress

1 个回复
最合适的回答,由SO网友:MrWhite 整理而成

如果要从/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]
TheRewriteCond 检查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)重定向。如果这些是永久性的,则更改RR=301, 但只有在你确认它工作正常后。301s被浏览器硬缓存,因此可能会导致测试出现问题。

结束

相关推荐

用于路由分离的REST API使用主题的.htaccess和代理设置

开发一个使用RESTAPI的解耦前端。。。我正在使用create-react-app 因此可以输入proxy my中WP对应的字段package.json 然后写我的电话fetch(\'/wp-json/v2/pages/...\') 如果我跑步yarn start 从前端目录。。。我很想在我的wp-content/themes/my-theme 尽管是目录我不是.htaccess 上帝我怎样才能做到:一般请求,如mysite.com/jibble/jabble 由我的SPA路由处理,如mysite.co