nginx中路径自动加斜杠,可解决wordpress的后台地址错误
在 Nginx 里面,目前的 WordPress 是这样子配置 rewrite 的:
location / {
if (-d wp-admin){
break;
}
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}
不过如果我们访问:
http://domain.com/wp-admin
注意后面没有斜杠的时候是可以打开的,但是如果再点其他的链接,那么目录引用的层级就会有问题,这时候我们需要加上一个自动加斜杠的机制。
wordpress 官方文档说明
# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
打开nginx的配置文件wordpress.conf,将上面的内容添加进去即可。
通用方案
在location的段落里添加
if (-d $request_filename) {
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
nginx 会进行判断,如果请求的是一个文件夹,会自动在最后加上 / 符号,如果请求的是一个文件,则不会改变原有 url。
这段正则表达式的解释如下:
- if (-d $request_filename) ,如果请求的是一个文件夹,则为真,进到if语句中执行
- rewrite: 执行url重写
^/(.*)([^/])$
表示以 / 符号开始并紧跟着任何字符,同时不是以 / 为结束的字符串http://$host/$1$2/
表示的重写后的地址,$host是请求的域名,注意为了匹配最后一个字符不为 /,最后一个字符会被分开,被 $2 捕获,将 $1$2 拼起来就是原来完整的字符串;- permanent 表示使用 301 响应码返回永久重定向。
但如果你的网址后面带了端口的话,那么转向时还是会出现403错误。即 $host 变量把端口弄没了,改成 $http_host 变量即可。