通常,我们在美化或者希望能更好的兼容搜索引擎的时候我们常常使用nginx的rewrite模块来实现,例如:我们希望原本的访问链接xxxx.com/xx/xx/xx.php?id=12,变成这种:xxx.com/xx/xx/12.html;又或者是原本的访问链接太长,我们希望能够简洁一点等等吧,下面我将针对这两种情况来做配置。

1. 实践

(1) 页面伪静态

将xxxx.com/xx/xx/xx.php?id=12这种访问链接变成xxx.com/xx/xx/12.html这种

下面笔者在本地的网站目录下创建一个test.php文件

$id = isset($_GET['id']) ?$_GET['id']:0 ;

echo '获取的id值为:'.$id;

图片.png

访问正常。

下面我们希望这个访问链接变成http://w.myblog.com/api/php/1.html.

...
location /api {
rewrite php/(\d+)\.html$ /api/php/test.php?id=$1;
}
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}

需要注意的是:rewrite 完后不能写break,否则php文件无法解析。

我们使用链接:http://w.myblog.com/api/php/1.html来访问下,

图片.png

发现可以配置成功了,但是小伙伴们可能会想这样配置可能不够灵活,比如php目录下有多个php文件呢,并且这些文件也需要传递参数。那针对这种情况,我们可以获取到对应的文件名称,不同的文件使用它对应的文件名称进行访问。类型这种:http://w.myblog.com/api/php/test-1.html,其中test是文件对于的文件名称,1 是需要传递的参数。那我们改下之前的配置:

...
location /api {
rewrite php/(.+)-(\d+)\.html$ /api/php/$1.php?id=$2;
}

...

图片.png

发现可以正常访问,那笔者再创建一个其他的文件test001.php进行测试下:

图片.png

发现也可以访问成功。说明配置成功了。

(2) 简化访问路径

使用过tp的或者其他一些类型的php框架小伙伴们我们在访问方法时需要这样访问:http://w.tp5.com/index.php/index/index/info,这个表示访问index模块的index控制器中的info方法,但是这么访问不太方便,我们希望去掉index.php,直接使用http://w.tp5.com/index/index/info访问,那我们就需要配置下nginx,做一个rewrite.

if (!-e $request_filename){
rewrite ^/(.*)$ /index.php?s=/$1 last;
}

这段配置的意思是:当访问的文件或者目录不存在时,重定向到某个php文件.

!-e 意思是:-e和!-e用来判断是否存在文件或目录。

last: 相当于apache里面的[L]标记,表示rewrite.

s:表示参数.

加上配置后我们再来访问下:

图片.png

发现可以正常访问了。需要注意的是:如果不写s=xxx,配置会不生效。

好了,本篇文章就到这里了,有需要补充的小伙伴欢迎在下面给我留言哦,看到会及时回复的。