Thinkphp5 Nginx Pathinfo配置

server {
    listen 80;
    server_name sui.com;
    root   /tmmee/sad.cn/public;
    index  index.php index.html index.htm;
  
  location ~* ^.+.(jpg|jpeg|gif|css|png|js|thumb) {
       expires 30d;
   }
   location / {
    try_files $uri @default;
}

location @default {
    fastcgi_pass            127.0.0.1:9000;
    fastcgi_param           SCRIPT_FILENAME $document_root/index.php;
    fastcgi_param           PATH_INFO       $fastcgi_script_name;
    fastcgi_param           PATH_TRANSLATED $document_root/index.php;
    include                 fastcgi_params;
}

location ~ \.php($|/) {
    fastcgi_pass            127.0.0.1:9000;
    fastcgi_split_path_info ^(.+?\.php)(/.+)$;
    fastcgi_param           SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param           PATH_INFO       $fastcgi_path_info;
    fastcgi_param           PATH_TRANSLATED $document_root$fastcgi_script_name;
    include                 fastcgi_params;
}

}

 

 

使用过 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 的信息,请查阅这里

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

 
  

server {
listen 80;
server_name sui.com;

 
  

root /tmmee/sad.cn/public;

 
  

location / {

index index.php index.html index.htm;

 
  

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

 
  

location ~ ^(.+\.php)(.*)$ {

fastcgi_pass 127.0.0.1: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;
}
}

 

 

转载于:https://www.cnblogs.com/boundless-sky/p/7649215.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值