AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 562756
Accepted
berkes
berkes
Asked: 2013-12-21 07:17:20 +0800 CST2013-12-21 07:17:20 +0800 CST 2013-12-21 07:17:20 +0800 CST

如何使用 nginx proxy_pass 删除路径

  • 772

我有一个正在运行的 Web 应用程序http://example.com/,并且想在 . 上的单独服务器上“挂载”另一个应用程序http://example.com/en。上游服务器proxy_pass似乎可以工作,但有一个问题:

upstream luscious {
 server lixxxx.members.linode.com:9001;
}

server {
  root /var/www/example.com/current/public/;
  server_name example.com;

  location /en {
    proxy_pass http://luscious;
  }
}

打开时example.com/en,我的上游应用程序返回404 not found /en。这是有道理的,因为上游没有 path /en。

是proxy_path正确的解决方案吗?我是否应该重写“上游”以便它/en作为根路径来监听?或者是否有一个指令允许我重写传递到上游的路径?

nginx
  • 5 5 个回答
  • 251033 Views

5 个回答

  • Voted
  1. Best Answer
    cnst
    2013-12-21T19:09:23+08:002013-12-21T19:09:23+08:00

    在不使用任何正则表达式的情况下,这可能是做你想做的最有效的方法:

    location = /en {
        return 302 /en/;
    }
    location /en/ {
        proxy_pass http://luscious/;  # note the trailing slash here, it matters!
    }
    
    • 275
  2. cnst
    2015-10-14T20:51:18+08:002015-10-14T20:51:18+08:00

    我想解决一个越来越受欢迎的基于正则表达式的新答案。

    location ~ ^/en(/?)(.*)$ {  # OOPS!
      proxy_pass http://luscious/$2$is_args$args;  # OOPS!
    }
    

    乍一看,该解决方案可能看起来更可爱,但由于多种原因,它是错误的。

    • 上面的正则表达式将匹配 的请求 uri /enjoy,将其重定向到/joy上游。这真的是故意的吗?

    • 一个请求/en不会导致任何重定向,直接/从上游提供一个(几乎就像一个请求/en/代替了,但不完全是)。如果您在上游根页面中使用相对 URI(否则,为什么/en/在上游 URI 中没有前缀?),例如src="style.css"(可能引用特定于语言的url("menu.png"),例如),那么浏览器将请求作为/style.css而不是/en/style.css. (或者即使你在任何地方都使用绝对 URI,如果有人相对地引用了一个不起眼的半可选资源怎么办?)糟糕,这个网站突然可能无法工作,但只是有时或在边缘情况下。

    • 根据我之前对 OP 自己的答案已经提到的另一个问题的建议,使用正则表达式可以防止proxy_redirect指令具有默认值default,而是将其off改为。这意味着如果上游Location: http://127.0.0.1:8080/en/dir/在发出请求时回复/en/dir,那么这就是客户端将看到的内容,这显然无法正常工作。(这对于一开始就提示使用正则表达式的请求来说尤其具有讽刺意味/en,但是这个特定的实现反而会遇到上面已经提到的另一个问题。)另外,如果您已经在使用upstream指令,那么如果你只是尝试使用自定义的,它可能会变得更加丑陋,特别是如果你可能有多个上游服务器 - 你如何proxy_redirect为每一个单独设置一个?您也可以在 中使用正则表达式proxy_redirect,甚至可以匹配任何主机,但是如果您决定将来提供跨域重定向怎么办?

    为了尝试使用单个基于正则表达式的位置来解决上述一些问题,我们可以执行以下操作(请注意,proxy_pass我们还必须从基于 - 的指令中删除对服务器的引用upstream,以使其proxy_redirect更直接):

    location ~ ^/en/?((?<=/).*)?$ {
      location = /en { return 302 /en/; }
      proxy_pass http://127.0.0.1:8080/$1$is_args$args;
      proxy_redirect http://127.0.0.1:8080/ /en/;
    }
    

    因此,如果您问我,与两个兄弟顶级位置的原始解决方案相比,通过使用正则表达式路线将自己挖进兔子洞仍然是一个更好的主意。

    • 20
  3. berkes
    2013-12-21T07:30:39+08:002013-12-21T07:30:39+08:00

    所以,我在 stackoverflow 上找到了答案:

    upstream luscious {
     server lixxxx.members.linode.com:9001;
    }
    
    server {
      root /var/www/example.com/current/public/;
      server_name example.com;
    
      location ~ ^/en(/?)(.*) {
        proxy_pass http://luscious/$2;
      }
    }
    

    基本上:将正则表达式传递到位置并将反向引用传递给 proxy_pass url。

    • 8
  4. Jeff
    2018-12-12T16:50:20+08:002018-12-12T16:50:20+08:00

    记账到Nginx 文档

    要将请求传递给 HTTP 代理服务器,需要在位置内指定 proxy_pass 指令。例如:

    location /some/path/ {
        proxy_pass http://www.example.com/link/;
    }
    

    此示例配置导致将在此位置处理的所有请求传递到指定地址的代理服务器。此地址可以指定为域名或 IP 地址。该地址还可能包括一个端口:

    location ~ \.php {
        proxy_pass http://127.0.0.1:8000;
    }
    

    请注意,在上面的第一个示例中,代理服务器的地址后跟一个 URI,/link/。如果 URI 与地址一起指定,它将替换请求 URI 中与 location 参数匹配的部分。例如,这里带有 /some/path/page.html URI 的请求将被代理到http://www.example.com/link/page.html。如果指定的地址没有 URI,或者无法确定要替换的 URI 部分,则传递完整的请求 URI(可能已修改)。

    • 6
  5. kabadisha
    2020-12-28T17:16:03+08:002020-12-28T17:16:03+08:00

    我对上面接受的解决方案进行了尝试,但发现它导致所有 CSS 和 JS 资产的重定向不可靠。最后,我从 LinuxServer SWAG Nginx 配置的完成方式中找到了灵感。你可以在这里找到它们。看看pihole.subfolder.conf.sample。

    因此,我的解决方案如下所示:

    location /en {
        return 302 $scheme://$host/en/;
    }
    
    location ^~ /en/ {
        set $upstream_app lixxxx.members.linode.com;
        set $upstream_port 9001;
        set $upstream_proto http;
        proxy_pass $upstream_proto://$upstream_app:$upstream_port;
    
        rewrite /en(.*) $1 break;
    }
    
    • 0

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve