Nginx 隐藏式跳转(浏览器 URL 跳转后保持不变)

背景

一个新项目,后端使用 PHP 实现,前端不做路由,提供一个模板,由后端路由控制。

Route::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 配置实现。

方案一

将所有 /pages 开头 URI 转发到一个新路由,使用 rewrite break + proxy_pass 实现。

server {
listen 80;
index index.php index.html;
server_name localhost;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /home/workspace/project/pms/public;

location / {
try_files $uri $uri/ /index.php$is_args$args;
}

location ~ /pages {
rewrite ^(/pages).*$ rewrite_pages/login break; # break 跳过当前的 rewrite 阶段(页面不重定向),并继续执行后续的配置
proxy_pass http://10.60.10.80:80; # 以 rewrite_pages/login 为 uri 重新请求 80 端口
}

location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass 10.60.10.80:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Route::get('rewrite_pages/{name}', [AppHttpControllersResourceController::class, 'getResourceVersion']);

方案二

借助 $request_uri,将所有以 /pages 开头的 URI 重新设置为一个固定的二级路由,如 /pages/login。PHP 将读取 REQUEST_URI 变量作为 URI

server {
listen 80;
index index.php index.html;
server_name localhost;
error_log /var/log/nginx/error.log notice;
access_log /var/log/nginx/access.log;
root /home/workspace/project/pms/public;
rewrite_log on;

set $request_url $request_uri; # 获取 $request_uri 变量,赋值给 $request_url

if ($request_url ~ ^/pages(.*)$ ) {
set $request_url /pages/login; # 设置 $request_url 为 /pages/login。其请求将继续走 location /
}

location / {nginx hidden jump
try_files $uri $uri/ /index.php$is_args$args;
}

location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass 10.60.10.80:9000;
fastcgi_index index.php;
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;
}
}

Link

  • https://juejin.cn/post/6861726452917174279
  • https://cloud.tencent.com/developer/article/1751890
  • https://getpocket.com/zh/read/1484601218


原文始发于微信公众号(DeppWang):Nginx 隐藏式跳转(浏览器 URL 跳转后保持不变)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/62579.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!