我正在尝试重定向
<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}
。
如果这有效或者您仍然遇到问题,请告诉我们!