rt,比如说thinkphp本身有默认路由,我们为了美化url,为什么不用服务器本身的url重写,而是用框架本身的路由来实现,是后者效率更高吗?
可控性更强, 往往服务器的环境是不可控的, 你不知道你的程序要什么环境下运行. 通过程序来实现URL重写, 可控性明显更强.
灵活性更强, 比如说我的运行环境不支持pathinfo方式, 我从pathinfo转到query string方式, 往往只需要修改一个配置就可以轻轻松松地实现。我从.html
后缀换成.aspx
后缀, 往往也只需要一个简单的配置就行了.
因为框架本身开发的时候,他是要竟可能排除外界所有干扰的。所以呢 框架就这么定义了,然后用的人呢一般都是懒的改或者不知道怎么改或者反正改不改都可以用,就形成了这一现象。然并卵,都可以
因为实际情况下写网站的人并不知道自己的网站是发布在哪里用哪个应用服务器的,
并且自己调试的时候是不会用到服务器的,
还有一个因素是服务器往往会同时运行多个网站,不能因为一个项目的URL配置就得经常重启。
框架普遍使用index.php作为前端控制器,所以一般都是配置服务器不是文件($uri)和目录($uri/)的请求都交给PHP来处理,比如Nginx:
location / {
try_files $uri $uri/ /index.php?$args;
}
比如请求是/post/1024?page=2&tag=lamp
Nginx会把这个东西交给/index.php处理.
index.php通过$_SERVER['QUERY_STRING']
拿到page=2&tag=lamp
通过parse_url($_SERVER['REQUEST_URI'])['path']
拿到/post/1024
拿到这些东西后框架会用正则表达式等来拿到具体参数,调用相应控制器来处理请求.
如果你使用的是页面控制器,则需要利用服务器的重写功能来美化URL,比如Discuz!
Nginx下Discuz!重写规则:
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
location / {
rewrite ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2 last;
rewrite ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3 last;
rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro.php?$2=$3 last;
rewrite ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3 last;
rewrite ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2 last;
}
Apache下Discuz!重写规则:
http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html
<IfModule mod_Rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2
RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3
RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\%3D$4&page=$3
RewriteRule ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3
RewriteRule ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2
</IfModule>
如果迁移服务器
如果考虑到架构扩展
而且个人觉得有些东西的产生有自己的目的和作用
不过这个想法不错
以上:好像都是废话..并没有给出实际的数据..
PHP最大的优点就是热部署 -- 服务器(apache/nginx)不需要重启
如果把url重写功能放到服务器软件里面,岂不是挥刀自宫,不如去用Java得了。