nginx的location配置导致网关返回404问题

 更新时间:2024年06月20日 08:49:10   作者:飘零未归人  

这篇文章主要介绍了nginx的location配置导致网关返回404问题,具有很好的参考价值,希望对大家有所帮助,如有错误未考虑完全的地方,望不吝赐教

目录
  • nginx的location配置导致网关返回404
  • nginx配置多个location访问报404
    • 解决方法
    • 完整配置
  • 总结

    nginx的location配置导致网关返回404

    再项目中使用nginx转发到网关时,发现返回了404.

    {
    
        "timestamp": "2023-11-01T02:12:48.788+00:00",
    
        "path": "//core-manage-web/core/core-manage/servers/findServers",
    
        "status": 404,
    
        "error": "Not Found",
    
        "message": null,
    
        "requestId": "642b125b"
    
    }

    从这个返回来看,应该是网关返回的信息。因为如果是nginx返回404的话,应该是返回的404.html才对。

    所以看看出是网关找不到转发的路径。 从  "path": "//core-manage-web/core/core-manage/servers/findServers",看出我们的接口经过nginx转发之后,居然只有两个//。正常应该只有一个才对。

    再看一下location配置:

    location /core {
        proxy_pass http://gateway-upstream/;
    }

    由于第一次使用使用nginx,所以对于这些配置还不是很了解。这上面的的  “location /core”标识路径前缀匹配。 而我的 “http://core-gateway-upstream/”是以“/”结尾,这表示会将 location的匹配路径(/core)替换掉在转发。

    gateway-upstream配置如下

    upstream gateway-upstream {
        server 192.168.111.1:10006;
    }

    所以如果我是用 http:localhost:8080/core/login/xxxxx访问,则经过nginx转发之后会变成192.168.111.1:10006//login/xxxxx

    所以需要将 location /core改成 location /core/。即可:

    location /core/ {
        proxy_pass http://gateway-upstream/;
    }

    nginx配置多个location访问报404

    解决方法

    在自己配置的location中不要使用root配置文件目录,替换为alias即可

    完整配置

    #user  nobody;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
        server {
            listen       8080;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                autoindex on;             #开启索引功能
                autoindex_exact_size off; # 关闭计算文件确切大小(单位bytes),只显示大概大小(单位kb、mb、gb)
                autoindex_localtime on;   # 显示本机时间而非 GMT 时间
                charset utf-8; # 避免中文乱码
                root   file;
                #index  index.html index.htm;
            }
            
            location /file {
    	    alias   html;
                index  index.html index.htm;
    	}
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
    
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    }
    
    

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持小闻网。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。