Apache 反向代理双尾斜杠

Apache 反向代理双尾斜杠

我在虚拟主机中设置了反向代理。但是,当我访问网站时:浏览器地址栏中显示的不是 ,而是https://example.com。为什么我的末尾有两个斜杠?我的 apache conf 有问题吗?(如下所示)或者末尾的斜杠可能是反向代理后面的网站通过 apache conf/.htaccess 添加的?https://example.com/https://example.com//

我当前的设置:

<VirtualHost *:80>
    ...
    RewriteEngine On
    RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
</VirtualHost>
<VirtualHost *:443>
    ...
    ProxyRequests Off
    SSLProxyEngine on
    ProxyPass / https://example.proxy.com/
    ProxyPassReverse / https://example.proxy.com/
</VirtualHost>

答案1

当我访问该网站时:我得到的https://example.com不是https://example.com/浏览器地址栏,而是https://example.com//

这两个请求(带斜杠和不带斜杠)实际上是同一件事。浏览器在这两种情况下都会向您的服务器发送相同的请求。因此,很难理解为什么您会在这两种情况下得到不同的响应,除非存在一些本地缓存问题?

(有关浏览器如何处理域名尾随斜杠的更多信息,请参阅我在 Pro Webmasters stack 上对以下问题的回答:https://webmasters.stackexchange.com/questions/35643/is-trailing-slash-automagically-added-on-click-of-home-page-url-in-browser

但是,容器RewriteRule中的指令<VirtualHost *:80>总是结果是双斜线 - 所以也许您看到的是来自先前 (错误) 重定向的缓存响应 (或浏览器自动完成)?请注意,301 重定向被浏览器硬性缓存。

RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

在一个虚拟主机上下文中,$1反向引用将捕获 URL 路径上的斜杠前缀(这与目录.htaccess上下文)。

您需要删除代换或者从捕获的模式中取出第一个斜杠(或使用REQUEST_URI服务器变量)。例如:

RewriteRule ^/(.*) https://example.com/$1 [R=301,L]

(不需要字符串末尾锚点,因为*默认情况下是贪婪的。)

并确保您的浏览器缓存已被清除。

相关内容