我已经在 website.conf 的 apache 配置中设置了 https,如下所示
<VirtualHost *:5061>
<Directory/var/www/website.com>
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
<Directory>
ServerName website.com
ServerAlias website
SSLEngine on
SSLCertificateKeyFile /etc/certs/website.key
SSLCertificateFile /etc/certs/website.crt
SSLCertificateChainFile /etc/certs/website.bundle
<virtualHost>
并且以上托管在 5061 端口上的是 REST API 服务,我希望任何尝试通过 http 访问 ServerName 的人都应被重定向到 https,而无需更改端口。
这可能吗 ?
答案1
标准做法是将 HTTP 连接重定向到 HTTPS 端口。如上文 Gerald 和 Steffen 所述,如果不进行大量额外设置,您无法在同一台服务器上的同一端口上同时托管 HTTP 和 HTTPS。
为什么要避免重定向到正确的端口?这会破坏您需要的特定实现吗?这是一种奇怪的情况,客户端不知道需要 SSL,但需要使用它,并且只能通过单个端口访问服务器。当然,并不是说这种情况不存在。
Apache Virtualhost SSL 重定向示例:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.example.com
Redirect / https://secure.example.com/
</VirtualHost>
<VirtualHost _default_:443>
ServerName secure.example.com
DocumentRoot /usr/local/apache2/htdocs
SSLEngine On
# etc...
</VirtualHost>
答案2
与普遍的看法相反,这实际上很容易做到。
如果您尝试与 HTTPS 端口建立 HTTP 连接,Apache 默认会返回“400 错误请求”和一个错误页面,说明您需要使用 HTTPS 连接到该端口。这就是您的机会。
在您的 vhost 中,只需一行配置就可以将 400 替换为 302 重定向,告诉浏览器重新连接到相同的主机和端口,但使用 HTTPS:
ErrorDocument 400 https://yourdomain:1000/
请注意,这会导致 302 重定向,而不是 301。301 可能是可行的,但配置可能会更复杂。
使用 HSTS 也是一个好主意,这样一旦浏览器通过 HTTPS 连接,以后任何尝试时,浏览器都会自动将 HTTP 交换为 HTTPS,而无需再次点击重定向。
还要注意,使用此方法,http://server:1000/something/ 将重定向到 https://server:1000/(站点的根目录)。可能有办法解决这个问题,但是,如果您使用 HSTS,一旦浏览器首次访问 HTTPS 站点,它将自动将 http://server:1000/something/ 转换为 https://server:1000/something/。
这是一个稍微复杂一些的配置,它强制 301 重定向而不是 302,并尝试保留 URI,尽管那部分似乎实际上不起作用。
ErrorDocument 400 /%{escape:%{REQUEST_URI}}
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^/?(.*) https://%{SERVER_NAME}:8181/$1 [R=301,L]
我认为,由于“使用 HTTP 访问 HTTPS 端口时生成 400”这一功能有点晦涩难懂,Apache 不会像平常一样填充 %{REQUEST_URI}。事实上,无论实际请求的是什么,也无论我使用的是 HTTP 1.1 还是 1.0,请求在日志中始终显示为“GET / HTTP/1.0”。因此,Apache 似乎被硬编码为将这些请求定向到“/”,这在一定程度上限制了我们的选择。
将您的域名添加到 HSTS 预加载列表 (https://hstspreload.org/) 也可能有用,这样(理想情况下)浏览器就会自动将 HTTP 切换到 HTTPS,即使它们尚未通过 HTTPS 连接并看到 HSTS 标头。
答案3
可以使用下面的方法完成此操作,同时保留请求 URI,以防不同用户的请求 URL 不同,这在需要隧道到达 Web 服务器时是正常的。
error_page 497 301 =307 https://$http_host$request_uri;
http_host 保留 URL 中的主机和端口。