【问题标题】:HTTPD ReverseProxy ProxyPass directive ending in wrong Location headerHTTPD ReverseProxy ProxyPass 指令以错误的 Location 标头结尾
【发布时间】:2021-12-21 22:56:33
【问题描述】:

HTTPD 配置如下:

#redirectder edit Location "(^http[s]?://)([^/]+)" "" port 80 to secure
<VirtualHost *:80>

    ServerName mitestui02.sn.test.net
    #ServerAlias server server2.domain.com server2
    ServerAdmin support.p240@test.com
    ErrorLog /var/log/test/iiq/appserver/apache-error.log
    CustomLog /var/log/test/iiq/appserver/apache-access.log common

    Redirect /identityiq/ https://mitestui02.sn.test.net/identityiq/
    Redirect / https://mitestui02.sn.test.net/identityiq/

</VirtualHost>

#redirect to port 8080 on localhost
<VirtualHost *:443>
    ServerName mitestui02.sn.test.net
    # ServerAlias mitestui02 mitestui02.sn.test.net
    ServerAdmin support.p240@test.com
    SSLProxyEngine On
    SSLEngine On
    #allow only tls
    SSLProtocol -all +TLSv1.2
    SSLHonorCipherOrder on
    SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384...
    
    SSLCertificateFile /etc/opt/test/iiq/appserver/secure/ssl/web-iiq.crt
    SSLCertificateKeyFile /etc/opt/test/iiq/appserver/secure/ssl/apache-iiq.key

    Redirect /identityiq/ https://mitestui02.sn.test.net/
    Redirect / https://mitestui02.sn.test.net/identityiq/

    ProxyRequests     Off
    ProxyPreserveHost On

    ProxyPass /identityiq/ http://localhost:8080/identityiq/

    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} ^OPTIONS
    RewriteRule .* - [F]

    <If "%{THE_REQUEST} =~ m#.jsf/?[?\s]#">
        Header add X-UI-Source "mitestui02"
        Header add X-UA-Compatible "IE=edge"
        Header add Referrer-Policy "strict-origin-when-cross-origin"
        Header add Feature-Policy "microphone 'none'; geolocation 'none'; usb 'none'; payment 'none'; document-domain 'none'; camera 'none'; display-capture 'none'; ambient-light-sensor 'none'"
        Header add Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()"
        Header add Strict-Transport-Security "max-age=63072000; includeSubDomains"
        Header add Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'"
        Header add X-Content-Type-Options "nosniff"

        Header always edit Set-Cookie (.*) "$1; Secure; SameSite=Strict"
        Header onsuccess edit Set-Cookie (.*) "$1; Secure; SameSite=Strict"
    </If>
</VirtualHost>

当我连接到前端 URL 时,https://mitest.sn.test.net/ 我被重定向,响应代码为 302,并且 Location 标头指向 https://mitestui02.sn.test.net/identityiq/ 而不是 >https://mitest.sn.test.net/identityiq/ .

直接连接到 https://mitest.sn.test.net/identity/ 时不会发生这种情况。

我尝试过使用不同的 ProxyPass 和 ProxyPassReverse 指令,并且还重写了 Location 标头,但似乎没有任何帮助。 谢谢

【问题讨论】:

  • 您提到的 302 似乎与您在 https 虚拟主机中定义的指令相匹配: Redirect / mitestui02.sn.test.net/identityiq 。如果你能解释在所有情况下你想做什么,那就更好了。如果您请求 / 或者如果您请求 /identityiq/ 等并远离可能冲突的重定向和 proxypass 指令,您想要什么,也就是说,如果您有一个指向路径的 proxypass 指令,为什么还要为它重定向?
  • 感谢您的意见。当用户连接到:mitest.sn.test.netmitest.sn.test.net/identityiq(有指向负载均衡器的 DNS 名称)时,请求应由后端服务器之一(例如 mitestui02)处理,无需重定向,例如用户他仍应在 URL 中查看 URL mitest,当用户连接到 mitest.sn.test.net/identityiq 时会发生这种情况,但连接到 mitest.sn.test.net 时不会发生这种情况

标签: apache reverse-proxy httpd.conf mod-proxy


【解决方案1】:

所以问题似乎与重定向指令有关。 我们删除了它们并为 443 添加了以下内容:

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
    RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301,NE]
    # Redirect / to /identiyiq
    RedirectMatch ^/$ /identityiq

我们删除了它们并为 80 添加了以下内容:

   Redirect permanent / https://mitestui02.sn.test.net/
  

现在它按预期工作了。

【讨论】:

  • 为什么要在 ssl virtualhost 中检查 http 协议?这没有道理。对于未来,我建议坚持重写或重定向,而不是两者兼而有之。
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 2016-08-29
  • 2019-01-28
  • 1970-01-01
相关资源
最近更新 更多