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 / 问题 / 1049834
Accepted
JellicleCat
JellicleCat
Asked: 2021-01-15 07:51:20 +0800 CST2021-01-15 07:51:20 +0800 CST 2021-01-15 07:51:20 +0800 CST

Apache ProxyPass + RewriteRule?

  • 772

我已经设置了一个 apache 配置来尝试重定向/login和 ProxyPass 所有其他请求:

RewriteEngine on
RewriteCond "%{REQUEST_URI}" "^/login$"
RewriteRule "^/login$" "https://sub.example.org/$1" [L,R]

SSLProxyEngine on
ProxyRequests off
ProxyPassMatch   ^/login ! # Prevent proxy on /login
ProxyPassReverse ^/login ! # Prevent proxy on /login
ProxyPassMatch   ^/      https://sub.example.org/
ProxyPassReverse ^/      https://sub.example.org/
ProxyPreserveHost off
RequestHeader set Host sub.example.org
Header set Host alt.example.org

我检查的大多数结果都符合我的预期:

  • alt.example.org/login 重定向到 sub.example.org/login
  • alt.example.org/users 显示 sub.example.org/users 的内容(没有重定向)

...但是https://alt.example.org/(空路径)会产生一个Location值为 的标头https://alt.example.org^/login。 哇!是什么导致^了域中的重定向,为什么它引用alt而不是sub?

在 apache 之上运行的 Rails 应用程序的日志表明 Rails 应用程序本身实际上正在重定向到https://sub.example.org/login,这更有意义,因为 ProxyPass 意味着 Rails 应该只看到 sub.example。 org 而不是 alt.example.org。那么为什么 apache 会给出 https://alt.example.org^/login 呢?

mod-proxy mod-rewrite apache-2.4 proxypass
  • 1 1 个回答
  • 760 Views

1 个回答

  • Voted
  1. Best Answer
    MrWhite
    2021-01-15T08:51:01+08:002021-01-15T08:51:01+08:00

    ...但是https://alt.example.org/(空路径)会产生一个Location值为 的标头https://alt.example.org^/login。哇!是什么导致^了域中的重定向,为什么它引用 alt 而不是 sub?

    该ProxyPassReverse指令不采用正则表达式作为第一个参数,这似乎是发生冲突的地方。这也不能!作为第二个论点。如果指令与响应不匹配,子alt域将出现在标头中。LocationProxyPassReverse

    您似乎不需要与ProxyPassReverse相关的第一个指令/login,因为该 URL 没有被代理。

    此外,这些ProxyPassMatch指令似乎将所有内容都代理到https://sub.example.org/- 您不想代理到目标域中的相应 URL 路径吗?虽然奇怪的是,这似乎是你观察到的结果中发生的事情?如果您确实想代理到相同的 URL 路径,那么您可以使用更简单的ProxyPass指令,并使用简单的前缀匹配而不是正则表达式。

    alt.example.org/login重定向到sub.example.org/login

    虽然这不是由您在顶部发布的“重定向”执行的,它会重定向到文档根目录,因为$1反向引用是空的,因为模式中没有捕获子RewriteRule 模式。正如您稍后所说,“Rails 应用程序本身实际上正在重定向到https://sub.example.org/login”。

    因此,为了重定向到sub.example.org/login(这似乎是意图),您需要更改指令以改为阅读以下内容:

    RewriteRule ^/(login)$ https://sub.example.org/$1" [R,L]
    

    RewriteCond此处不需要前面的指令,因为它只是重复您已经在RewriteRule 模式中执行的相同检查。

    RequestHeader set Host sub.example.org
    

    该行是多余的,因为这是前面ProxyPreserveHost off指令的目的。

    Header set Host alt.example.org
    

    这一行似乎也是多余的,因为Host它是请求标头,而不是响应标头。

    ProxyPassMatch   ^/login ! # Prevent proxy on /login
    

    此外,Apache 不支持行尾注释。只是因为处理 Apache 指令的方式有一个“怪癖”,才能防止这个特定的行尾注释破坏你的服务器!

    因此,考虑到上述几点,请尝试以下操作:

    RewriteEngine on
    
    # Externally Redirect "/login" to other domain
    RewriteRule ^/(login)$ https://sub.example.org/$1" [R,L]
    
    SSLProxyEngine on
    
    ProxyRequests off
    ProxyPreserveHost off
    
    # Prevent proxy on /login
    ProxyPass /login !
    
    # Proxy all other URLs
    ProxyPass / https://sub.example.org/
    ProxyPassReverse / https://sub.example.org/
    
    • 2

相关问题

  • mod_rewrite 不添加 REDIRECT_URL 环境变量

  • Apache 2.2.3 代理到 Tomcat 5.5 上的 mod_proxy 返回错误 502 Bad Gateway

  • mod_proxy apache 加载错误 - ap_timeout_parameter_parse

  • 启动 httpd 时 mod_proxy 加载错误

  • 如何将 Apache 配置为使用 HTTPS 进行外部访问,而使用 HTTP 进行内部访问?

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