V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
msg7086
V2EX  ›  PHP

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

  •  
  •   msg7086 · 2015-08-03 11:31:06 +08:00 · 3427 次点击
    这是一个创建于 3400 天前的主题,其中的信息可能已经有所发展或是发生改变。

    手头维护的一个论坛上了个新系统是用 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;
    }
    

    存档以留给后人。

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

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

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

    的确,直接定点解析index.php更快而且更安全。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2585 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:41 · PVG 10:41 · LAX 18:41 · JFK 21:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.