首先了解路由的传递过程;
你的网站向用户发送的HTML文件中的包含的URL链接,即为用户点击该链接后,在用户浏览器地址栏出现的链接;
所以一切的URL优化先从a标签开始;
<a href="/tnys/nys/ys">抬你一手</a>
如果a标签的URL为"/tnys/nys/ys.html";(tnys前面的斜杠/代表根目录)
在用户点击后;
浏览器地址栏出现的即为"www.tainiyishou.cn/tnys/nys/ys.html";
此链接首先发送给web服务器处理,Apache或者Nginx;
而web服务器并不懂你这一串的URL具体的请求是什么;
只会把它当成一串文件路径;
在你网站根目录下按这样的路径寻找文件 tyns->nys->ys.html
然而实际上并不存在这样的路径,只有你放在根目录下的静态文件.js.css之类的实际存在的文件能被找到;
而上面的一串URL只是一串发送给入口文件index.php的请求,分别代表着模块名、控制器名、方法名;
所以需要给web服务器指明方向,配置路由重写
1.以下是Apache的路由重写文件.htaccess,放在入口文件同级目录下
<IfModule mod_rewrite.c>
Options All
RewriteEngine On
RewriteBase /
#找不到文件夹及文件及执行重写规则
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
#将URL转接至index.php后
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
重写规则:
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
^(.*)$ 为正则匹配语句,匹配所有非空字符,此例匹配到的为tnys/nys/ys.html
$1则指代匹配到的内容,转接到index.php后;
接下来则由PHP处理请求;
2.以下为Nginx重写规则
nginx路由重写在nginx的配置文件中完成
打开配置文件
vim /usr/local/nginx/conf/nginx.conf
server
{
listen 80;
#listen [::]:80;
server_name www.tainiyishou.cn tainiyishou.cn;
index index.html index.htm index.php;
#网站根目录
root /home/www/tainiyishou/tnys;
#重写规则
location / {
if (!-e $request_filename){
rewrite ^/(.*) /index.php?s=$1 last;
}
}
#phppathinfo设置
location ~ \.php {
set $path_info "";
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param SERVER_PORT 80;
include fastcgi_params;
}
}
Nginx不支持pathinfo,所以需要手动配置,加上以上的#phppathinfo设置即可
如果你的入口文件index.php放在网站根目录下
即网站根目录为 root /home/www/tainiyishou/tnys
而 index.php在tnys目录下
重写规则只用一条就够了,和Apache同理
#location / 代表位于根目录下
location / {
#如果找不到文件
if (!-e $request_filename){
#则重写路由
rewrite ^/(.*) /index.php?s=$1 last;
}
}
如果你的入口文件index.php放在二级目录下
即网站根目录为 root /home/www/tainiyishou/
而入口文件在 tainiyishou/tnys/index.php
则重写规则为
#位于根部录下时,即浏览器地址栏为www.tainiyishou.cn/
#将路由转到/tnys/index.php下
location / {
rewrite / /tnys/index.php last;
}
#位于二级目录下时
location /tnys/ {
#文件不存在,则将(.*)里的内容转发到/tnys/index.php?s=$1
if (!-e $request_filename){
rewrite ^/tnys/(.*) /tnys/index.php?s=$1 last;
}
}
路由规则配置好后,接下来的处理内容都将交给PHP,与web服务器无关
如果你想用更精简的路由,比如直接用方法名访问
<a href="/tnys/nys/ys.html">抬你一手</a>
可直接改为
<a href="/ys.html">抬你一手</a>
以上URL代表访问tnys模块下的nys控制器下的ys方法
(此例用的是thinkphp框架)
同时在框架的路由配置文件route.php中加入
return [
'ys' => 'tnys/nys/ys',
];
即可使用www.tainiyishou.cn/ys.html
访问到原来的www.tainiyishou.cn/tnys/nys/ys.html的内容;
完;