当前位置: 移动技术网 > 网络运营>服务器>nginx > Nginx如何实现pathinfo模式的方法详解

Nginx如何实现pathinfo模式的方法详解

2019年04月18日  | 移动技术网网络运营  | 我要评论

河北11选5前二玩法-上竤彩玩,睹物思人的意思,陈照海

什么是pathinfo模式呢?

pathinfo是伪静态的一种,我们先解释一下伪静态的概念,伪静态页面是静态url与动态url互通的一个桥梁,它是指动态网址通过url重写的手段去掉其动态参数,使url静态化,但在实际的网页目录中并没有重写url。简单来说,伪静态url就是通过服务器转换伪装文件名或地址,使该页面类似于静态页面,但服务器上没有独立存在的文件,其本质还是动态页面。

使用过 thinkphp 框架开发应用的同学应该都会知道,它有一种 url 模式就是 pathinfo,看起来类似下面的 url:

http://example.com/module/controller/action/key1/value1/key2/value2.html

其实上面的 url 的原型是下面的样子:

// 这个才是正宗的 url,上面那个是冒牌的
http://example.com/index.php?m=module&c=controller&a=action&key1=value1&key2=value2

既然 pathinfo 模式的 url 不是正宗的,那为什么不用正宗的呢,用正宗的不好吗?相对于正宗的 url,pathinfo 模式的确实是有优势的,以下简单列举几项它的好处。

  • 它提供了最好的seo支持
  • 可以实现 url 的伪静态
  • 它看起来更简洁、更好看

pathinfo 模式的 url 有这么多优点,那我们肯定要支持了。thinkphp 更多的 url 模式配置及实现,可以参考这篇文档。

本文主要讨论的是 pathinfo 模式的 url 在 nginx 中的实现,thinkphp 官方文档中没有介绍,但是它实现起来也挺简单的。以下是实现过程的一些思考。

一个标准的通用的 url 格式是类似下面那样子的:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

参照通用的 url 格式,对比可以发现,pathinfo 模式的相对于标准模式的 url,有两个地方的区别比较大,一个是没有了 index.php 文件,另一个是查询参数并没有使用符号“?”隔开。

现在要做的就是在 nginx 接收的 pathinfo 模式的 url 请求时,将它还原成标准的 url 模式,这样服务器就能正常处理了。

把缺失的 index.php 文件补上

这个需要用到 nginx 的 rewrite 指令,它的作用是将请求的 uri 替换成目标 url。在这里需要达到的效果是,将

http://example.com/module/controller/action/key1/value1/key2/value2.html

替换成

http://example.com/index.php/module/controller/action/key1/value1/key2/value2.html

当然,并不是所有的 uri 都会进行此规则的重写,只有那些不是文件的 uri 才进行重写。所以,关于重写的指令将会类似下面的:

# 如果请求的文件不存在,则进行 uri 重写
# 在原有的基础上添加入口文件 index.php
if (!-e $request_filename) {
 rewrite ^/(.*)$ /index.php/$1 last;
}

通过以上配置就能达到补全 index.php 入口文件的效果了。

区分符号 ?前后的内容

在通用的 url 中,符号“?”是具有特殊作用的,它是用来将查询字符串和前面的文件隔开。在 pathinfo 模式的 url 中,符号“?”没有了,也就是说,服务器无法区分 uri 中哪些是文件,哪些是查询字符串了。所以,我们的目的是将 pathinfo 模式中本来应该由符号“?”区分的内容给手动区分开来。

还好,nginx 中有个指令可以实现我们的目的,fastcgi_split_path_info。它可以将正则表达式定义的两个串分别赋值给变量 $fastcgi_script_name 和变量 $fastcgi_path_info,以供后文使用。更多关于 fastcgi_split_path_info 的信息,请查阅这里

相关配置类似下面的代码:

location ~ ^(.+\.php)(.*)$ {
 root /var/www/html/$vhost_path;
 fastcgi_pass phpfpm:9000;
 fastcgi_split_path_info ^(.+\.php)(.*)$;
 fastcgi_param script_filename $document_root$fastcgi_script_name;
 fastcgi_param path_info $fastcgi_path_info;

 include fastcgi_params;
}

一个简单的例子

通过上面两部份的配置,现在的 nginx 服务器已经支持 pathinfo 模式的 url 了,以下是一个简单的 server 配置,仅供参考:

server {
 listen 80;
 server_name tp5.loc;

 set $vhost_path tp5/public;

 location / {
 root /usr/share/nginx/html/$vhost_path;
 index index.php  index.htm;

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

 location ~ ^(.+\.php)(.*)$ {
 root /var/www/html/$vhost_path;
 fastcgi_pass phpfpm:9000;
 fastcgi_split_path_info ^(.+\.php)(.*)$;
 fastcgi_param script_filename $document_root$fastcgi_script_name;
 fastcgi_param path_info $fastcgi_path_info;

 include fastcgi_params;
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网