# (6)URL优化 #### 1. 隐藏index.php 即隐藏入口文件,官方链接,打开翻到最下面就能看到了:[http://www.kancloud.cn/manual/thinkphp5/118012,](http://www.kancloud.cn/manual/thinkphp5/118012%EF%BC%8C) 最新版本的框架写的小项目都是不需要index.php就能访问下去的,例如http://127.0.0.1/tp5/public/index/login/login 也能访问到登录界面,而我们主要做的就是怎么配置,让url看起来更简洁,最好是http//:域名/方法名,这种访问方式。 #### 2. apache配置 这里我做的是加一个端口来做,本地的80 端口我在用 - 首先找到httpd-vhosts.conf,我这里的绝对路劲D:/wamp64/bin/apache/apache2.4.18/conf/extra/httpd-vhosts.conf - 然后在这个文件里面加上下面的代码 ``` <VirtualHost *:8081> ServerName localhost DocumentRoot D:/wamp64/www/tp5/public <Directory "D:/wamp64/www/tp5/public/"> Options +Indexes +FollowSymLinks +MultiViews AllowOverride All Require local </Directory> </VirtualHost> ``` - 然后再在D:/wamp64/bin/apache/apache2.4.18/conf/original/httpd.conf文件下面加一个端口,Ctrl+f查找Listen,大概在下面代码的位置,我加了一个Listen 8081,然后重启apache, ``` # Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses. # #Listen 12.34.56.78:80 Listen 0.0.0.0:80 Listen [::0]:80 Listen 8081 Listen 8080 ``` - 接下来你再访问http://127.0.0.1:8081/index/login/login, 也能进入到你的登录界面,但是我这个里面,样式文件竟然丢了,这是因为之前在配置文件里面写的是:` ``` <?php return [ "web_root" => "/tp5/public/static/", "web" => "/tp5/public/index.php/", 'session' => [ 'auto_start' => true, 'name' => 'login@', 'expire' => 1800, /*时间长度*/ ], ]; ``` 现在需要把 "web\_root" => "/tp5/public/static/",改为 "web\_root" => "/static/",这样样式又回来了,到这里很多小伙伴肯定会想,与其在配置里面这样写,还不如不写,直接将模板文件的 ``` <link rel="stylesheet" type="text/css" href="{$Think.config.web_root}css/main.css"> ``` 改为 ``` <link rel="stylesheet" type="text/css" href="/static/css/main.css"> ``` ,这里,我也是这样改的,看起来会更舒服一点。 - 到这里,其实127.0.0.1:8081就是ServerName,也就是以后你的网址,后面的/index/login/login感觉还是太长了,这里还可以精简,很多小伙伴到这里都会想到官方的绑定模块名,绑定控制器名,因为这里是单一模块,确实可以这样做,但是控制器不唯一,所以点到为止。 - 我理想的访问最简单的就是网址后面加一个方法名就能看到页面,即ServerName/方法名。所以接下来在application/route.php文件下面加上一条配置: ``` "login"=>"index/login/login" ``` 然后我就可以直接用方法名访问登录界面了:<http://127.0.0.1:8081/login> ,由于thinkphp路由的唯一性,只要写了这条配置,你再访问http://127.0.0.1:8081/index/login/login 反而会报错呢,在这里留心一下就可以了。 - 其实这个url我还是觉得不是很舒服,我想现在就看到网址加方法名的效果,[比如说thinkphp.com/login](http://xn--thinkphp-jo1ot97lz3ze.com/login) ,没问题,这都是小事。 - 打开D:/wamp64/bin/apache/apache2.4.18/conf/extra/httpd-vhosts.conf,就是上面的那个文件,再加上一段代码:(看到端口号又变成了80端口,ServerName变成了 [thinkphp.com](http://thinkphp.com)) ``` <VirtualHost *:80> ServerName thinkphp.com DocumentRoot D:/wamp64/www/tp5/public <Directory "D:/wamp64/www/tp5/public/"> Options +Indexes +FollowSymLinks +MultiViews AllowOverride All Require local </Directory> </VirtualHost> ``` - 再用编辑器打开C:\\Windows\\System32\\drivers\\etc\\hosts,在最下方加上一条127.0.0.1 [thinkphp.com](http://thinkphp.com),保存,重启apache - [http://thinkphp.com/login,](http://thinkphp.com/login%EF%BC%8C) 我再在浏览器中输入就能访问到登录界面了 . - 但是这里你会发现,无论是输入输入密码错误,或者是输入验证码错误,都跳转不回登录界面,并且就算你密码跟验证码都输入对了,还是不行,憋着急,都是简化URl惹的祸,我带你改几个地方就好了(找到问题就好解决,既然跳转不行,就找有跳转的地方): 首先:controller/Login.php的logining方法改为,对比前后看变化 ``` public function logining() { $name = input('request.name'); $password = input('request.password'); $data = input('request.captcha'); if(!captcha_check($data)){ //验证失败 return $this->error("验证码错误","location:/login"); }; $check=\app\index\model\Admin::login($name, $password); if ($check) { header(strtolower("location:/admin")); exit(); }else{ return $this->error("用户名或密码错误","location:/login"); } } ``` 然后就OK啦。 ### 总结: - 现在你可以访问http://127.0.0.1:8081/login 或者http://thinkphp.com/login 访问到你的登录界面,另外我再补充几个路由配置,在route.php里面: ``` <?php /**** @author:1132w11 2016.10.25 14:02; ****/ return [ '__pattern__' => [ 'name' => '\w+', ], '[hello]' => [ ':id' => ['index/hello', ['method' => 'get'], ['id' => '\d+']], ':name' => ['index/hello', ['method' => 'post']], ], "login"=>"index/login/login", //登录页面 "logining"=>"index/login/logining", //登录页面 "/"=>"index/index/index", //默认首页 "admin"=>"index/admin/admin", //后台页面 "changepsw"=>"index/admin/changepsw", //修改密码页面 "logout"=>"index/admin/logout", //退出登录 "changepassword"=>"index/admin/changepassword", //修改密码 ]; ``` 这里要保证方法名的唯一性。简单一点就是每个控制器每个方法都要写一遍!后面再优化这个route.php 温馨提示:在每一个跳转动作的时候,一定要注意路径中前面的斜杠"/"是否要加,如果加了斜杠导致跳转不过去或者报错,尝试去掉一下!项目中跳转主要出现在a标签的url、form表单提交的action还有success跟error判断处。