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

请教一个 nginx 重写问题

  •  
  •   awker · 130 天前 · 1308 次点击
    这是一个创建于 130 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个后端服务,地址是 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
        1
    yuikns   130 天前
    试试这个:

    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;

    }
        2
    beginor   130 天前 via Android
    这个需求就不再是 proxy 了, 应该是 rewrite
        3
    gstqc   130 天前 via Android
    rewrite 再 proxy_pass
        4
    imdong   130 天前
    nginx 重写里面 规则的 末尾 带不带 / 不是一个意思...
    参考 1 楼...
        5
    awker   130 天前
    @yuikns 这样请求就变成 http://ip:port/web-test/test/ 了
        6
    JavaFirstMaster   130 天前
    最简化配置
    ```
    location ^~ /test/ {
    rewrite ^/test/(.*) /web-test/$1 break;
    proxy_pass http://127.0.0.1:8888;
    }
    ```
        7
    awker   130 天前
    @JavaFirstMaster 你这种跟我给出的是一样的作用
    location ^~ /test/ {
    proxy_pass http://127.0.0.1:8888/web-test/;
    }
        8
    awker   130 天前
    找到解决办法了
    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;
    }

    就可以了
        9
    JavaFirstMaster   130 天前
    @awker 你有实际测试吗?
    v2ex 没法放图,搜一个博客给你看看 https://xuexb.com/post/nginx-url-rewrite.html
    请看此博客中"简单例子"的第 14 行.
        10
    awker   130 天前 via iPhone
    @JavaFirstMaster 一样的
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1631 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 18ms · UTC 16:43 · PVG 00:43 · LAX 09:43 · JFK 12:43
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1