将端口 5061 上的 http url 重定向到 apache 上的 https 同一端口 5061

将端口 5061 上的 http url 重定向到 apache 上的 https 同一端口 5061

我已经在 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>

https://wiki.apache.org/httpd/RewriteHTTPToHTTPS

答案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 中的主机和端口。

相关内容