Apache 将 http://%{HTTP_HOST}:%{SERVER_PORT}/%{REQUEST_URI} 重定向到 https://%{HTTP_HOST}%{REQUEST_URI}

Apache 将 http://%{HTTP_HOST}:%{SERVER_PORT}/%{REQUEST_URI} 重定向到 https://%{HTTP_HOST}%{REQUEST_URI}

我正在尝试重定向

<VirtualHost *:5555>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteCond %{SERVER_PORT} =5555
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

但是,当我尝试通过 Web 浏览器连接时,它会/%{HTTP_HOST}//%{REQUEST_URI}

如何删除值之间的多余的 /?

答案1

如果Redirect指示<Location>在或<LocationMatch>部分中使用并URL-path省略,则 URL 参数将使用表达式语法进行解释。

此语法在 Apache 2.4.19 及更高版本中可用

这再次使得何时不使用 mod_rewrite

<VirtualHost *:5555>
    <Location />
        Redirect permanent https://%{HTTP_HOST}/
    </Location>
</VirtualHost>

答案2

无需检查端口或是否为 SSL,如果 SSL 请求到达此处,您将收到错误,因为虚拟主机无法应答,并且虚拟主机已经指定它是端口 5555,即此虚拟主机正在应答的端口,因此您不需要这些冗余指令。

如果您坚持使用 mod rewrite 并使用变量,这将是最简单/正确的方法。

<VirtualHost *:5555>
    ServerName normallyouwantahostnamehere.example.com
    RewriteEngine On
    RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [R=301,L]
</VirtualHost>

如果您知道主机名,我会倾向于正确定义它并使用简单的重定向(无需捕获即可重定向所有内容):

<VirtualHost *:5555>
    ServerName hostname.example.com
    Redirect / https://hostname.example.com/
</VirtualHost

答案3

看起来您正在尝试将端口 5555 上的 HTTP 请求重定向到 HTTPS,并且 和 之间没有额外的斜杠%{HTTP_HOST}%{REQUEST_URI}您可以通过RewriteRule稍微修改来实现这一点。

这是更新后的配置:

<VirtualHost *:5555>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteCond %{SERVER_PORT} =5555
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

这里的关键变化是在RewriteRule。通过使用^before https://%{HTTP_HOST},它将规则锚定到 URL 的开头,确保不会插入多余的斜线。

经过此修改,重定向应该可以正常工作,而不需要%{HTTP_HOST}和之间的额外斜线%{REQUEST_URI}

如果这有效或者您仍然遇到问题,请告诉我们!

相关内容