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 / 问题 / 561892
Accepted
Hard worker
Hard worker
Asked: 2013-12-18 04:05:16 +0800 CST2013-12-18 04:05:16 +0800 CST 2013-12-18 04:05:16 +0800 CST

如何使用反向代理正确处理相对 url

  • 772

我在 Apache 中有如下反向代理设置:

地址为 www.example.com/folder 的服务器 A 是反向代理服务器。

它映射到:地址为 test.madeupurl.com 的服务器 B

这种作品。但是我遇到的问题是,在 www.example.com/folder 上,所有相关链接的形式都是 www.example.com/css/examplefilename.css 而不是 www.example.com/folder/css/examplefilename。 css

我该如何解决?

到目前为止,我的反向代理在服务器 A (www.example.com) 上有这个:

<Location /folder>
    ProxyPass  http://test.madeupurl.com
    ProxyPassReverse http://test.madeupurl.com
</Location>
linux
  • 3 3 个回答
  • 186015 Views

3 个回答

  • Voted
  1. Best Answer
    HBruijn
    2013-12-18T04:36:14+08:002013-12-18T04:36:14+08:00

    Apache ProxyPassRewrite 不会重写从http://test.example.com收到的响应正文,仅重写标题(如重定向到 404 页面等)。

    多种选择:

    一)重写内部应用程序以使用相对路径而不是绝对路径。即../css/style.css代替/css/style.css

    二)将内部应用程序重新部署在同一子目录/folder中,而不是在 test.example.com 的根目录中。

    三)一个和两个通常不太可能发生......如果你很幸运,内部应用程序只使用两个或三个子目录,而这些子目录在你的主站点上没有使用,只需编写一堆 ProxyPass 行:

    # Expose Internal App to the internet.
    ProxyPass /externalpath/  http://test.example.com/
    ProxyPassReverse /externalpath/  http://test.example.com/
    # Internal app uses a bunch of absolute paths. 
    ProxyPass /css/  http://test.example.com/css/
    ProxyPassReverse /css/  http://test.example.com/css/
    ProxyPass /icons/  http://test.example.com/icons/
    ProxyPassReverse /icons/  http://test.example.com/icons/
    

    四)为内部应用程序创建一个单独的子域并简单地反向代理所有内容:

    <VirtualHost *:80>
       ServerName app.example.com/
       # Expose Internal App to the internet.
       ProxyPass /  http://test.internal.example.com/
       ProxyPassReverse /  http://test.internal.example.com/
    </VirtualHost>
    

    五)有时开发人员完全无能为力,他们的应用程序不仅生成绝对 URL,甚至在其 URL 中包含主机名部分,生成的 HTML 代码如下所示<img src=http://test.example.com/icons/logo.png>:

    A ) 您可以使用水平分割 DNS 和方案 4 的组合解决方案。内部和外部用户都使用 test.example.com,但您的内部 DNS 直接指向 test.example.com 的服务器的 IP 地址。对于外部用户,test.example.com 的公共记录指向您的公共网络服务器 www.example.com 的 IP 地址,然后您可以使用解决方案 4。

    B ) 实际上,您不仅可以让 apache 代理对 test.example.com 的请求,还可以在将响应正文传输给您的用户之前重写响应正文。(通常代理只重写 HTTP 标头/响应)。apache 2.2 中的 mod_substitute。我还没有测试它是否与 mod_proxy 很好地堆叠,但也许以下工作:

    <Location /folder/>
      ProxyPass http://test.example.com/
      ProxyPassReverse http://test.example.com/ 
      AddOutputFilterByType SUBSTITUTE text/html
      Substitute "s|test.example.com/|www.example.com/folder/|i" 
    </Location>
    
    • 112
  2. Lucas Cimon
    2014-10-10T16:27:59+08:002014-10-10T16:27:59+08:00

    作为HBruijn答案的补充,如果您选择解决方案(3) “ProxyPass”,您可能还必须使用mod_proxy_html重写 HTML 页面中的一些 URL。

    参看。对于某些示例,如何使用反向代理正确处理相对 url 。

    作为一个应用示例,您可以使用以下ProxyHTMLURLMap规则配置 Apache,将your-domain-name.com/pad中的所有内容转发到在端口 9001 上本地运行的Etherpad实例:

    <Location /pad>
      ProxyPass http://localhost:9001 retry=0
      # retry=0 => avoid 503's when restarting etherpad-lite
      ProxyPassReverse http://localhost:9001
      SetOutputFilter proxy-html
      ProxyHTMLURLMap http://localhost:9001
    </Location>
    RewriteRule ^/pad$ /pad/ [R]
    
    • 13
  3. ThanhHH
    2015-05-09T00:52:36+08:002015-05-09T00:52:36+08:00

    您可以使用以下方式制作反向代理:
    1. 安装 mod_proxy_html

        yum install mod_proxy_html
    
    1. 加载 mod_proxy_html 模块

      LoadModule proxy_html_module modules/mod_proxy_html.so
      
    2. 并使用以下设置

      ProxyRequests off  
      ProxyPass /folder/  http://test.madeupurl.com  
      ProxyHTMLURLMap http://test.madeupurl.com  /folder  
      
      <Location /folder/>  
          ProxyPassReverse /  
          ProxyHTMLEnable On  
          ProxyHTMLURLMap  /  /folder/  
          RequestHeader    unset  Accept-Encoding  
      </Location>  
      

    希望这有帮助。

    • 11

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

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