Nginx如何实现pathinfo模式的方法详解
发布时间 - 2026-01-11 03:24:14 点击率:次什么是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.html 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;
}
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
# nginx
# pathinfo配置
# 支持pathinfo
# pathinfo
# 解决nginx不支持thinkphp中pathinfo的问题
# Ubuntu下Nginx配置ThinkPHP的Pathinfo和URl Rewrite模式
# nginx+thinkphp下解决不支持pathinfo模式
# nginx中配置pathinfo模式示例
# Nginx隐藏index.php和Pathinfo模式配置例子
# nginx 开启 pathinfo的过程详解
# 重写
# 就能
# 可以实现
# 相对于
# 的是
# 是一个
# 替换成
# 没有了
# 文档
# 在这里
# 有个
# 是有
# 最好的
# 才是
# 将会
# 基础上
# 是指
# 有一种
# 但在
# 有一定
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现模型的全局作用域?(Global Scope示例)
Laravel如何实现数据库事务?(DB Facade示例)
如何实现javascript表单验证_正则表达式有哪些实用技巧
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
如何用狗爹虚拟主机快速搭建网站?
如何用y主机助手快速搭建网站?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
,南京靠谱的征婚网站?
Laravel如何配置任务调度?(Cron Job示例)
中山网站推广排名,中山信息港登录入口?
如何快速查询网址的建站时间与历史轨迹?
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
Laravel模型事件有哪些_Laravel Model Event生命周期详解
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
Laravel中的withCount方法怎么高效统计关联模型数量
Bootstrap CSS布局之列表
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
使用spring连接及操作mongodb3.0实例
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
如何快速生成橙子建站落地页链接?
Laravel怎么上传文件_Laravel图片上传及存储配置
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
佛山企业网站制作公司有哪些,沟通100网上服务官网?
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
Linux系统运维自动化项目教程_Ansible批量管理实战
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
青岛网站建设如何选择本地服务器?
网站制作报价单模板图片,小松挖机官方网站报价?
潮流网站制作头像软件下载,适合母子的网名有哪些?
Laravel如何使用Sanctum进行API认证?(SPA实战)
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
如何在服务器上三步完成建站并提升流量?
Laravel如何使用Collections进行数据处理?(实用方法示例)
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
详解MySQL数据库的安装与密码配置
如何在阿里云部署织梦网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Laravel如何为API生成Swagger或OpenAPI文档
Python文件异常处理策略_健壮性说明【指导】
如何在企业微信快速生成手机电脑官网?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】

