<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule>
如果用的phpstudy,规则如下:
<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] </IfModule>
接下来就可以使用下面的URL地址访问了
如果使用的apache版本使用上面的方式无法正常隐藏index.php,可以尝试使用下面的方式配置.htaccess文件:
<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] </IfModule>
如果是Nginx环境的话,可以在Nginx.conf中添加:
location / { // …..省略部分代码 if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=https://www.jb51.net/$1 last; break; } }
定义路由
URL地址里面的index模块怎么才能省略呢,默认的URL地址显得有点长,下面就来说说如何通过路由简化URL访问。
我们在路由定义文件(application/route.php)里面添加一些路由规则,如下:
return [ // 添加路由规则 路由到 index控制器的hello操作方法 'hello/:name' => 'index/index/hello', ];
该路由规则表示所有hello开头的并且带参数的访问都会路由到index控制器的hello操作方法。
路由之前的URL访问地址为:
定义路由后就只能访问下面的URL地址
[注意]定义路由规则后,原来的URL地址将会失效,变成非法请求。
但这里有一个小问题,如果我们只是访问
将发生错误
事实上这是由于路由没有正确匹配到,我们修改路由规则如下:
return [ // 路由参数name为可选 'hello/[:name]' => 'index/hello', ];
使用[]把路由规则中的变量包起来,就表示该变量为可选,接下来就可以正常访问了
当name参数没有传入值的时候,hello方法的name参数有默认值World,所以输出的内容为 Hello,World!
除了路由配置文件中定义之外,还可以采用动态定义路由规则的方式定义,例如在路由配置文件(application/route.php)的开头直接添加下面的方法:
use think\Route; Route::rule('hello/:name', 'index/hello');
完成的效果和使用配置方式定义是一样的。
无论是配置方式还是通过Route类的方法定义路由,都统一放到路由配置文件application/route.php文件中
[注意]路由配置不支持在模块配置文件中设置
【完整匹配】
前面定义的路由是只要以hello开头就能进行匹配,如果需要完整匹配,可以使用下面的定义:
return [ // 路由参数name为可选 'hello/[:name]$' => 'index/hello', ];
当路由规则以$结尾的时候就表示当前路由规则需要完整匹配。
当我们访问下面的URL地址的时候:
// 正确匹配
// 正确匹配
// 不会匹配
【闭包定义】
还支持通过定义闭包为某些特殊的场景定义路由规则,例如:
return [ // 定义闭包 'hello/[:name]' => function ($name) { return 'Hello,' . $name . '!'; }, ];
或者
use think\Route; Route::rule('hello/:name', function ($name) { return 'Hello,' . $name . '!'; });
[注意]闭包函数的参数就是路由规则中定义的变量
因此,当访问下面的URL地址:
会输出
Hello,thinkphp!
【设置URL分隔符】
如果需要改变URL地址中的pathinfo参数分隔符,只需要在应用配置文件(application/config.php)中设置:
// 设置pathinfo分隔符 'pathinfo_depr' => '-',
路由规则定义无需做任何改变,我们就可以访问下面的地址:
【路由参数】
还可以约束路由规则的请求类型或者URL后缀之类的条件,例如:
return [ // 定义路由的请求类型和后缀 'hello/[:name]' => ['index/hello', ['method' => 'get', 'ext' => 'html']], ];
上面定义的路由规则限制了必须是get请求,而且后缀必须是html的,所以下面的访问地址:
// 无效
// 有效
// 无效
// 有效
【变量规则】
接下来,尝试一些复杂的路由规则定义满足不同的路由变量。在此之前,首先增加一个控制器类如下: