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

为什么 PHP 写 web, url 需要重写规则?

  •  
  •   Gem · 2017-04-14 18:16:50 +08:00 · 2441 次点击
    这是一个创建于 2780 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这几天看下 php ,发现 url 需要在 nginx 下重写规则(叫伪静态?不太懂),才能实现类似 python | ruby 下的 www.abc/list/1 这样直观的 url 表现形式,而 python|ruby 下写 web ,直接就是直观的 url 表现形式,没有什么规则重写。请教下大家,这是什么原因,谢谢。
    9 条回复    2017-04-15 04:20:02 +08:00
    zdkmygod
        1
    zdkmygod  
       2017-04-14 18:28:19 +08:00   ❤️ 4
    很简单啊,因为 PHP 自带一个 router 的实现,这个 router 实现的比较难用( url 直接对应到文件)。所以大家想用自定义 router 替代自带的 router 的话,首先就得把自带的 router 效果纠正过来,发送给自定义 router 。

    而 Python 和 Ruby 不像 PHP 一样本身就是一个简单的框架, HTTP 请求会直接发送给自定义 router 进行处理。
    acoldfox
        2
    acoldfox  
       2017-04-14 18:47:11 +08:00
    为什么不用框架
    Gem
        3
    Gem  
    OP
       2017-04-14 18:53:16 +08:00
    @acoldfox 框架同样需要重写规则吧?看 laravel ,也是需要的,不过我对 php 不熟悉,不太清楚。
    zhujinliang
        4
    zhujinliang  
       2017-04-14 18:56:28 +08:00   ❤️ 1
    最早的 web 就是一个 URL 对应一个文件
    后来有了动态页面,从 cgi 到 asp 到 php ,也都是这个套路,一个 URL 还是对应的磁盘上的一个文件去处理它,只不过实际内容是程序输出的
    然而现在有人觉得这样丑,不够高大上,没有逼格(好好好,我知道你们的借口是不方便开发,不够 MVC )
    那怎么办, fastcgi 表示我只管调用 php 不关我事啊, nginx 说 rewrite 吧,把所有找不到文件的请求都 rewrite 到一个 php 文件上,后面还是原来的处理逻辑,那个 php 文件再判断到底是要干啥

    同样坑爹的还有 pathinfo ,谁特么想出来的这馊主意
    qhxin
        5
    qhxin  
       2017-04-14 19:00:11 +08:00 via Android
    PHP 前面有一个 webserver
    jarlyyn
        6
    jarlyyn  
       2017-04-14 19:03:47 +08:00
    某种角度来说,这是 php 的坑之一。

    合理的文件布局和 Nginx 可以避免一部分这个坑点。
    zhujinliang
        7
    zhujinliang  
       2017-04-14 19:04:59 +08:00
    python 这种本来不是为 web 设计的语言,因为有网络能力,于是有人做了 http 库,语言内实现了 http 服务,也就是 nginx 的基本功能,既然是自己实现的,一来是想怎么搞就怎么搞,二来是本身语言内没有文件概念,所有的请求都没有对应的文件,必需要对请求的 URL 做路由处理
    realpg
        8
    realpg  
       2017-04-14 19:13:14 +08:00
    学习 CGI 模型去……
    dangyuluo
        9
    dangyuluo  
       2017-04-15 04:20:02 +08:00
    一般这么做是为了隐藏 index.php ,和做 MVC 吧。
    apache 读取到 http 头里的路径信息,然后首先添加上 index.php 作为统一入口交给 php 进行处理,然后 php 框架(如 CI )获取到 controller 和对应的 method 后,去找这个类并进行处理。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1192 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 18:30 · PVG 02:30 · LAX 10:30 · JFK 13:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.