[存档] ThinkPHP 框架在 Nginx 下的伪静态问题

2015-08-03 11:31:06 +08:00
 msg7086

手头维护的一个论坛上了个新系统是用 ThinkPHP 写的。装上以后发现伪静态不能用。
(你给的是 .htaccess 啊当然不能用了

放狗搜了一下,发现几乎都是先用 Rewrite 重写成 index.php/XXXYYY,然后再在 PHP 段里把后缀拆出来扔进 PATH_INFO 里,不能更麻烦。

想了一下,写了以下配置代码,测试一次通过。

location ~* \.php$ {
    fastcgi_pass unix:/var/run/php5.sock;
    include fastcgi.conf;
+   fastcgi_param PATH_INFO $request_uri;
}

存档以留给后人。

3362 次点击
所在节点    PHP
9 条回复
Kokororin
2015-08-03 11:51:23 +08:00
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
不需要PATHINFO
ryd994
2015-08-03 12:17:05 +08:00
@Kokororin if is evil
而且if -e这是明显可以用try_files完成的
BOYPT
2015-08-03 12:34:03 +08:00
@Kokororin 显然效率更差,! -e 是nginx pitfall里面典型的反例子
Kokororin
2015-08-03 12:39:33 +08:00
@BOYPT
@ryd994
确实,不过官方手册是这种写法。
msg7086
2015-08-03 14:00:45 +08:00
@Kokororin 就是因为看到了官方这种神奇写法我才来发帖的。
帖子里提了,Rewrite,然而你不觉得这链接更难受了么。
Kokororin
2015-08-03 16:27:03 +08:00
@msg7086 你是说链接会出现?s=xxx?照官方的写法的话,实际链接还是http://site/Contorller/Action的形式。
realpg
2015-08-03 18:36:44 +08:00
好评收藏。
其实这是个通用的方案了,可以解决很多框架的路由问题。只要支持pathinfo模式的
如果在强化一下,fastcgi解析从*.php换成index.php,然后排除一个static静态目录其他的强制重写,就更完美了
jarlyyn
2015-08-03 19:13:36 +08:00
框架没入口么……

这不是上传任何一个php都能运行了么?
msg7086
2015-08-03 20:30:47 +08:00
@Kokororin 不是啊。我是说$uri变量会先被改写一次,然后被重新内部路由一次,然后送进PHP以后再要被额外处理一下下……各种Bug什么的就是这么来的,比如地址里哪个地方没decode了啦……

@realpg
@jarlyyn
我这边因为还要考虑到第三方开发团队各种奇葩的问题,所以还是先搞成泛匹配。
location / 里有 try_files $uri $uri/ index.php;。

的确,直接定点解析index.php更快而且更安全。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/210395

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX