Typecho或WordPress Nginx伪静态规则如何设置,才能达到访问 abc.com/123/ 跳转到 abc.com/123.html 的效果?
最近,把VPS面板升级为宝塔后,遇到了很多问题。一一记录下,以供遇到同样问题的人参考。
问题描述
今天这个问题就是:
使用wdcp时,因为wdcp支持apache的htaccess 和 nginx 伪静态,所以一些伪静态规则很好设置,网上随便一搜就找到了。
但是宝塔只支持通过nginx来设置伪静态。那么就需要将之前apache的htaccess转为nginx伪静态规则。
在网上找了好久的文章,试来试去,都没有结果。
解决过程
后来无意中试了下宝塔后台给网站设置伪静态时,旁边有一个工具提示:Apache转Nginx。进去一试,把转换的结果放进宝塔面板,还是没有任何效果。
我的原始apache htaccess代码时这样的:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.geek100.com [NC]
RewriteRule ^(.*)$ https://geek100.com/$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
RedirectMatch 301 ^/(\d+)$ /$1.html
RedirectMatch 301 ^/(\d+)/$ /$1.html
</IfModule>
通过宝塔官方的工具转换成了这样:
if ($http_host ~* "^www.geek100.com"){
set $rule_0 1$rule_0;
}
if ($rule_0 = "1"){
rewrite ^/(.*)$ https://geek100.com/$1 permanent;
}
if (!-f $request_filename){
set $rule_1 1$rule_1;
}
if (!-d $request_filename){
set $rule_1 2$rule_1;
}
if ($rule_1 = "21"){
rewrite ^/(.*)$ /index.php/$1 last;
}
试了,还是不行。
后来又发现宝塔官方这个工具也是参考外国友人写的一个工具(htaccess to nginx converter)来的。于是我直接去外国友人这个工具转换了一下,好家伙,怎么转换出来的结果和宝塔官方的工具差别这么大:
# nginx configuration
location ~ ^/(\d+)$ {
rewrite ^(.*)$ /$1.html redirect;
}
location ~ ^/(\d+)/$ {
rewrite ^(.*)$ /$1.html redirect;
}
location / {
if ($http_host ~* "^www.geek100.com"){
rewrite ^(.*)$ https://geek100.com/$1 redirect;
}
if (!-e $request_filename){
rewrite ^(.*)$ /index.php/$1 break;
}
}
结果
最后我稍微修改了下,以便适应宝塔后台的要求,如下图:
Ok,大功告成,满足了我以下2点需求:
- 访问http://www.geek100.com/,都跳转到 https://geek100.com/;
- 因为历史原因,我以前设置的伪静态链接规则是 https://geek100.com/3109/,很多搜索引擎收录结果还是这种链接格式,如果不跳转访问过来就会找不到内容。现在我要求访问 https://geek100.com/3109/ 跳转到 https://geek100.com/3109.html。这一点也可以了。