V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
awker
V2EX  ›  Linux

请教一个 nginx 重写问题

  •  
  •   awker · 2018-11-12 02:42:30 +08:00 · 2410 次点击
    这是一个创建于 1984 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个后端服务,地址是 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 条回复    2018-11-12 19:21:34 +08:00
    yuikns
        1
    yuikns  
       2018-11-12 05:49:35 +08:00
    试试这个:

    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  
       2018-11-12 07:47:50 +08:00 via Android
    这个需求就不再是 proxy 了, 应该是 rewrite
    gstqc
        3
    gstqc  
       2018-11-12 08:39:04 +08:00 via Android
    rewrite 再 proxy_pass
    imdong
        4
    imdong  
       2018-11-12 08:54:23 +08:00
    nginx 重写里面 规则的 末尾 带不带 / 不是一个意思...
    参考 1 楼...
    awker
        5
    awker  
    OP
       2018-11-12 09:15:11 +08:00
    @yuikns 这样请求就变成 http://ip:port/web-test/test/ 了
    JavaFirstMaster
        6
    JavaFirstMaster  
       2018-11-12 09:30:06 +08:00
    最简化配置
    ```
    location ^~ /test/ {
    rewrite ^/test/(.*) /web-test/$1 break;
    proxy_pass http://127.0.0.1:8888;
    }
    ```
    awker
        7
    awker  
    OP
       2018-11-12 14:45:06 +08:00
    @JavaFirstMaster 你这种跟我给出的是一样的作用
    location ^~ /test/ {
    proxy_pass http://127.0.0.1:8888/web-test/;
    }
    awker
        8
    awker  
    OP
       2018-11-12 14:48:52 +08:00
    找到解决办法了
    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  
       2018-11-12 17:49:49 +08:00
    @awker 你有实际测试吗?
    v2ex 没法放图,搜一个博客给你看看 https://xuexb.com/post/nginx-url-rewrite.html
    请看此博客中"简单例子"的第 14 行.
    awker
        10
    awker  
    OP
       2018-11-12 19:21:34 +08:00 via iPhone
    @JavaFirstMaster 一样的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3763 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 10:29 · PVG 18:29 · LAX 03:29 · JFK 06:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.