我在虚拟主机中设置了反向代理。但是,当我访问网站时:浏览器地址栏中显示的不是 ,而是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]
(不需要字符串末尾锚点,因为*
默认情况下是贪婪的。)
并确保您的浏览器缓存已被清除。