Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
awker
V2EX  ›  Linux

请教一个 nginx 重写问题

  •  
  •   awker · Nov 12, 2018 · 3138 views
    This topic created in 2752 days ago, the information mentioned may be changed or developed.

    有一个后端服务,地址是 http://127.0.0.1:8888/web-test/

    nginx 配置如下

        location ^~ /web-test/ { 
            proxy_set_header X-Real-Ip $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_pass http://127.0.0.1:8888;
        }
    

    访问 http://ip:port/web-test/ 是可以访问的

    但我想改写成访问 http://ip:port/test/ 替代 访问 http://ip:port/web-test/ nginx 配置如下

        location ^~ /test/ { 
            proxy_set_header X-Real-Ip $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_pass http://127.0.0.1:8888/web-test/;
        }
    

    重写后访问 http://ip:port/test/ 后出现问题,看到请求下面的 url 都返回 404

    http://127.0.0.1:8888/web-test/resource/... 
    http://127.0.0.1:8888/web-test/image/...
    http://127.0.0.1:8888/web-test/system/...
    http://127.0.0.1:8888/web-test/其他 URI/...
    

    这种情况 nginx 要怎样配置重写规则?访问 http://ip:port/test/ 能返回正常的请求

    10 replies    2018-11-12 19:21:34 +08:00
    yuikns
        1
    yuikns  
       Nov 12, 2018
    试试这个:

    location /test {
    proxy_pass http://127.0.0.1:8888/web-test;

    proxy_set_header X-Real-Ip $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;

    }
    beginor
        2
    beginor  
       Nov 12, 2018 via Android
    这个需求就不再是 proxy 了, 应该是 rewrite
    0ZXYDDu796nVCFxq
        3
    0ZXYDDu796nVCFxq  
       Nov 12, 2018 via Android
    rewrite 再 proxy_pass
    imdong
        4
    imdong  
       Nov 12, 2018
    nginx 重写里面 规则的 末尾 带不带 / 不是一个意思...
    参考 1 楼...
    awker
        5
    awker  
    OP
       Nov 12, 2018
    @yuikns 这样请求就变成 http://ip:port/web-test/test/ 了
    JavaFirstMaster
        6
    JavaFirstMaster  
       Nov 12, 2018
    最简化配置
    ```
    location ^~ /test/ {
    rewrite ^/test/(.*) /web-test/$1 break;
    proxy_pass http://127.0.0.1:8888;
    }
    ```
    awker
        7
    awker  
    OP
       Nov 12, 2018
    @JavaFirstMaster 你这种跟我给出的是一样的作用
    location ^~ /test/ {
    proxy_pass http://127.0.0.1:8888/web-test/;
    }
    awker
        8
    awker  
    OP
       Nov 12, 2018
    找到解决办法了
    1、
    location ^~ /test/ {
    proxy_set_header X-Real-Ip $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://127.0.0.1:8888/web-test/;
    }
    其他请求也 proxy_pass 到后端服务
    location /web-test/resource/ {
    proxy_pass http://127.0.0.1:8888;
    }
    location /其他请求 {
    }
    这种方式要找到所有请求到后端的 uri,一个个重写

    2、
    直接修改后端服务路由为 http://127.0.0.1:8888/test/,规则变为
    location ^~ /test/ {
    proxy_set_header X-Real-Ip $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://127.0.0.1:8888;
    }

    就可以了
    JavaFirstMaster
        9
    JavaFirstMaster  
       Nov 12, 2018
    @awker 你有实际测试吗?
    v2ex 没法放图,搜一个博客给你看看 https://xuexb.com/post/nginx-url-rewrite.html
    请看此博客中"简单例子"的第 14 行.
    awker
        10
    awker  
    OP
       Nov 12, 2018 via iPhone
    @JavaFirstMaster 一样的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3936 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 04:16 · PVG 12:16 · LAX 21:16 · JFK 00:16
    ♥ Do have faith in what you're doing.