当前位置 主页 > 服务器问题 > nginx问题汇总 >

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

    栏目:nginx问题汇总 时间:2018-10-24 16:49

    pathinfo是伪静态的一种,对于用过thinkphp的朋友们来说应该都不陌生,下面这篇文章主要给大家介绍了关于Nginx如何实现pathinfo模式的方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。

    什么是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.phpif (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$1 last;}

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

    区分符号 ?前后的内容

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