问题:
原laravel路由 /pc/product
需要转换为 /product 让URL短一点有利于SEO
先上解决方案:
NGINX 配置:
location ~ \.php(.*)$ {
set $isp "";#设置空变量
if ($request_uri ~* "^/(product|buy)(.*)$"){
set $isp "/pc";#如果匹配到RUI设置变量为/pc前缀
}
root /data/www/public;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;#先加载params配置
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param REQUEST_URI $isp$request_uri;#将前缀加到REQUEST_URI中,这里是关键,laravel就是根据这个参数来进行路由解析的
fastcgi_param HTTPS on;
client_max_body_size 50m;
}
尝试过程及分析:
失败尝试:
想用rewrite:
location ~* ^/product(.*)$ {
rewrite "^/product(.*)$" /pc/product$1;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
访问出现laravel的404页面
再次试验:
location ~* ^/product(.*)$ {
#rewrite "^/product(.*)$" /pc/product$1;
return 302 /pc/product$1;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
可以正常跳转,说明location规则进入了,为什么rewrite不行呢?
分析:
rewrite其实是成功了,不然返回的404应该是系统404,那么问题就清楚了,是laravel没有识别到路由
dd了一下$request
发现路由是在服务器变量REQUEST_URI中的
于是,采用本文开篇的方案,判断如果符合我们定义的规则,就将正确的路由拼接起来放在REQUEST_URI中
搞定。
上面代码中的 if ($request_uri ~* "^/(product|buy)(.*)$"){ 里的 (product|buy) 是因为有两个路由都要这么转,如果只转一个路由的话是这样的:
if ($request_uri ~* "^/product(.*)$"){