摘要:现在要做的就是在接收的模式的请求时,将它还原成标准的模式,这样服务器就能正常处理了。还好,中有个指令可以实现我们的目的,。
使用过 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 格式是类似下面那样子的:
:// : @ : / ; ? #
参照通用的 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; } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/40568.html
摘要:现在要做的就是在接收的模式的请求时,将它还原成标准的模式,这样服务器就能正常处理了。还好,中有个指令可以实现我们的目的,。 使用过 ThinkPHP 框架开发应用的同学应该都会知道,它有一种 URL 模式是 pathinfo,看起来类似下面的 URL: http://example.com/module/controller/action/key1/value1/key2/value2...
摘要:客户端允许上传的最大文件大小不然会出现错误监听端口如果不设置这个,则会监听所有的端口,非一定是下的端口。这个可以把去掉就是的形式是否允许访问目录转发端口这边要求必须有两个捕获组下面这个要求替换成,否则会出现错误 http { # 客户端允许上传的最大文件大小...!不然会出现 http 413 错误 client_max_body_size 1000M; ...
摘要:客户端允许上传的最大文件大小不然会出现错误监听端口如果不设置这个,则会监听所有的端口,非一定是下的端口。这个可以把去掉就是的形式是否允许访问目录转发端口这边要求必须有两个捕获组下面这个要求替换成,否则会出现错误 http { # 客户端允许上传的最大文件大小...!不然会出现 http 413 错误 client_max_body_size 1000M; ...
摘要:最近使用框架进行开发的时候遇到一个问题,把项目部署到上用当服务器的情况下,重定向出现问题,同样的后缀,在本地环境可以正常访问,在服务器上就出现了,但是使用的全路径是可以访问的。 最近使用thinkPHP框架进行开发的时候遇到一个问题,把项目部署到Linux上用nginx当服务器的情况下,URL重定向出现问题,同样的URL后缀,在本地环境可以正常访问,在服务器上就出现了404 ,但是使用...
摘要:最近使用框架进行开发的时候遇到一个问题,把项目部署到上用当服务器的情况下,重定向出现问题,同样的后缀,在本地环境可以正常访问,在服务器上就出现了,但是使用的全路径是可以访问的。 最近使用thinkPHP框架进行开发的时候遇到一个问题,把项目部署到Linux上用nginx当服务器的情况下,URL重定向出现问题,同样的URL后缀,在本地环境可以正常访问,在服务器上就出现了404 ,但是使用...
阅读 1665·2023-04-25 20:16
阅读 3803·2021-10-09 09:54
阅读 2641·2021-09-04 16:40
阅读 2458·2019-08-30 15:55
阅读 806·2019-08-29 12:37
阅读 2717·2019-08-26 13:55
阅读 2875·2019-08-26 11:42
阅读 3127·2019-08-23 18:26