当前位置: 首页 > 知识库问答 >
问题:

后端 - nginx实现301跳转问题,跳转后访问变成404?

方兴旺
2023-05-24

配置如下:

server {
#     listen *:8080;
#     listen [::]:8080;
    listen *:80;
    listen [::]:80;

    server_name test.vv.com;
    header_filter_by_lua_file /etc/nginx/lua/logmerge.lua;

    set $cache_server "cacheserver";
    set $cpid '-';   

    index index.html index.htm index.php;
    access_log /var/log/nginx/static-website.access.log hycdnex;
    error_log /var/log/nginx/static-website.error.log info;

    location /cyum {
        proxy_pass http://cacheserver;
        proxy_read_timeout 120;
        proxy_connect_timeout 90;
        proxy_redirect off;
        proxy_http_version 1.1;

        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-From-IP $remote_addr;
        proxy_intercept_errors on;
        error_page 301 = @error_page_302;
        error_page 302 = @error_page_302;
        error_page 303 = @error_page_302;
        error_page 307 = @error_page_302; 
    }

    location /anolis {
        proxy_pass http://$cache_server;
        proxy_read_timeout 120;
        proxy_connect_timeout 90;
        proxy_redirect off;
        proxy_http_version 1.1;

        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-From-IP $remote_addr;
    }
    
    location @error_page_302 {
        resolver   117.136.194.211 39.135.2.193 114.114.114.114;
        set        $duri  "";
        if ($upstream_http_location ~* "http://(.*)") {set $duri http://$1;}
        if ($upstream_http_location ~* "https://(.*)") {set $duri https://$1;}
        #proxy_pass              http://$duri;
        proxy_pass            $duri;
        proxy_read_timeout    120;
        proxy_connect_timeout 90;
        proxy_http_version    1.1;
        proxy_set_header      Connection "";
        proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header      X-From-IP $remote_addr;
        proxy_force_ranges    on;
        proxy_set_header      Proxy '';
  }

    send_timeout 300s;
}

cache_server表示ats,里面代理的源站有301,301回来后在nginx用301的Location的url发起请求,但是,后续请求变成404

共有1个答案

姚凯歌
2023-05-24

可能是因为你在@error_page_302 location中有一个if语句,而nginx的if语句是不推荐使用的,可能会导致一些奇怪的行为。你可以尝试将if语句替换为更安全的map指令。

另外,你也可以检查一下proxy_pass设置的url是否正确,你可以在@error_page_302 location中添加error_log,并观察日志中是否有关于proxy_pass的错误信息。

你可以尝试将@error_page_302 location中的if语句替换为以下的map指令:

map $upstream_http_location $duri {
    ......
    ~(http://.*)  $1;
    ~(https://.*) $1;
    ......
}

别忘了重启nginx服务,使配置生效。

 类似资料:
  • 本文向大家介绍详解nginx 301跳转到带www域名方法,包括了详解nginx 301跳转到带www域名方法的使用技巧和注意事项,需要的朋友参考一下 前提:在域名解析中添加 domain.com 和 www.domain.com 指向你的主机IP地址 方法1. 打开 nginx.conf 文件找到你的server配置段: 方法2. 在配置文件里面写两个server,domain.com指向www

  • 有多个菜单页面,页面上方都有查询,封装了查询组件,切换页面的时候要重置查询条件-searchObj 我用pinia来存查询条件,searchObj,然后每个页面监听searchObj,条件变化就发起查询 问题是: 当我切换页面的时候把查询条件重置,这时候就会触发当前页面的watch,然后发起查询,就是跳转前就发起了查询 请问怎么解决这种问题,或者怎么这样的布局还有什么其他方法实现

  • 本文向大家介绍Angular 页面跳转时传参问题,包括了Angular 页面跳转时传参问题的使用技巧和注意事项,需要的朋友参考一下 首先,你需要已经配置过你的rout,比如: 其中注意第二个地址信息中的params属性,这个就是你要接受参数的对象,以key :value的形式定义 而在跳转页面时,两个方法都可以传参,一种是直接写在html中 此时传参跟在页面地址的后面 第二种就是写在control

  • 我在我的代码中使用ffmpeg库从摄像机捕获rtsp流并用FLV编写。如果我只从一个摄像机捕获流,而摄像机只有视频流,那么没有任何错误,我得到了第一个带有pts和DTS1698557894的包,其他包的pts和dts慢慢增加。但是如果摄像机有视频和音频流,那么奇怪的事情就会发生。例如,视频数据包pts和dts以1698557894开始并缓慢增加,音频数据包以0开始并缓慢增加,在~50之后,数据包跳

  • 需求是点退出后返回首页,碰到的问题是如果当前正好在首页点的退出,页面不会刷新,请问该如何处理? 加了随机参数也没用

  • 跳转到下一个方法 操作步骤: 菜单栏: Navigate —> Next Method(下一个方法) 快捷键: Mac: control + ↑ (此快捷键与可能与系统快捷键冲突,请自行修攺) Windows\/Linux: Alt + ↑ 跳转到上一个方法 操作步骤: 菜单栏: Navigate —> Previous Method(上一个方法) 快捷键: Mac: control + ↓ (此