一个新的项目,后端使用PHP实现,前端不做路由,而是提供模板,由后端路由控制。
路线::get('pages/{name}',[AppHttpControllersResourceController::class,'getResourceVersion']);
访问以pages/
开头的路径时,如http://10.60.10.80/pages/login
,后端返回指定模板。出现问题,前端可能会修改浏览器地址,如:http://10.60.10.80/pages/projects/detail?id=1
。此时,如果用户刷新页面,就会出现404问题。
所以当访问类似这样的非二级路由的URL时,需要隐式跳转到pages/
二级路由,而不需要改变浏览器地址。这可以使用修改后的 Nginx 配置来实现。
使用重写中断
+ proxy_pass
,将所有以 /pages
开头的 URI 转发到新路由。
服务器{
听80;
索引index.php index.html;
server_name本地主机;
error_log /var/log/nginx/error.log;
access_log /var/ log/nginx/access.log;
root /home/workspace/project/pms/public;
位置 / {
try_files $uri $uri/ /index.php$is_args$args;
}
位置 ~ /pages {
重写 ^(/pages).*$ rewrite_pages/login break; #break 跳过当前重写阶段(页面不重定向)并继续后续配置
Proxy_pass http://10.60.10.80:80; # p Rewrite_pages/login 重新请求端口 80}} local ~ .php $ {
try_files $ uri = 404;
fastcgi_sp lit_path_info ^(.+.php)(/.+)$;
fastcgi_pass 10.60.10.80:9000;
fastcgi_index index.php;
包括fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
路线::get('rewrite_pages/{name}',[AppHttpControllersResourceController::class,'getResourceVersion']);
在$request_uri
的帮助下,将所有以/pages
开头的URI重置为固定的辅助路由,例如/pages/login
。 PHP 会将 REQUEST_URI
变量读取为 URI
服务器{
听80;
索引index.php index.html;
server_name本地主机;
error_log /var/log/nginx/error.log通知;
access_log /var /log/nginx/access.log;
root /home/workspace/project/pms/public;
rewrite_log on;
设置 $request_url $request_uri; # 获取 $request_uri 变量并将其分配给 $request_url
if ($request_url ~ ^/pages(.*)$ ) {
set $request_url /pages/login; # 将 $request_url 设置为 /pages/login.它的请求会继续去位置/
}
位置/{nginx隐藏跳转
try_files $uri $uri/ /index.php$is_args$args;
}
位置〜.php $ {try_files $ uri = 404; fastcgi_split_path_info ^(。+。 ;
include fastcgi_params;
fastcgi_param REQUEST_URI $request_url; # 注意,这应该放在fastcgi_params之后,因为fastcgi_params包含REQUEST_URI变量
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}