如何配置Apache在具有别名的虚拟主机上将HTTP重定向到HTTPS?

pcww981p  于 2022-11-16  发布在  Apache
关注(0)|答案(1)|浏览(248)

我有一个虚拟站点配置如下,它重定向所有HTTP请求到HTTPS:

<VirtualHost *:80>

        ServerName api.example.com

        ProxyPreserveHost on
        ProxyPass / http://localhost:8080/
        ProxyPassReverse / http://localhost:8080/

        RewriteEngine on
        RewriteCond %{HTTP:Upgrade} websocket [NC]
        RewriteCond %{HTTP:Connection} upgrade [NC]
        RewriteRule ^/?(.*) "ws://localhost:8080/$1" [P,L]

        RewriteCond %{SERVER_NAME} =api.example.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>

但是下面的配置不起作用,它只是为用户提供站点的HTTP版本:

<VirtualHost *:80>

        ServerName secondexample.co.zw
        ServerAlias www.secondexample.co.zw
        ProxyPreserveHost on
        ProxyPass / http://localhost:8080/
        ProxyPassReverse / http://localhost:8080/

        RewriteEngine on
        RewriteCond %{HTTP:Upgrade} websocket [NC]
        RewriteCond %{HTTP:Connection} upgrade [NC]
        RewriteRule ^/?(.*) "ws://localhost:8080/$1" [P,L]

        RewriteCond %{SERVER_NAME} =www.secondexample.co.zw [OR]
        RewriteCond %{SERVER_NAME} =secondexample.co.zw
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>

我注意到的唯一区别是第二个配置有一个别名。第二个配置有什么问题?

k4ymrczo

k4ymrczo1#

<VirtualHost *:80>

    ServerName secondexample.co.zw
    ServerAlias www.secondexample.co.zw
    ProxyPreserveHost on
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/

    RewriteEngine on
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteCond %{HTTP:Connection} upgrade [NC]
    RewriteRule ^/?(.*) "ws://localhost:8080/$1" [P,L]

    RewriteCond %{SERVER_NAME} =www.secondexample.co.zw [OR]
    RewriteCond %{SERVER_NAME} =secondexample.co.zw
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>

规则的顺序不正确。规范重定向(HTTP到HTTPS)必须排在第一位。但是,如果要从HTTP重定向到HTTPS,则此处不需要任何代理指令,应将其删除。假定<VirtualHost *:443>容器中重复了代理指令。
如果你只是将HTTP重定向到HTTPS,那么你不需要使用mod_rewrite。更简单的mod_alias Redirect指令是更好的。你应该规范化(www vs non-www)主机名作为重定向的一部分(除非你正在实施HSTS),而不是重定向到同一个主机。
例如,它可以简化为:

<VirtualHost *:80>
    ServerName secondexample.co.zw
    ServerAlias www.secondexample.co.zw
    Redirect 301 / https://secondexample.co.zw/
</VirtualHost>

然后,所有代理指令都位于<VirtualHost *:443>容器中。
这同样适用于您的第一台vHost。
我注意到的唯一区别是第二个配置有别名。
Alias在这里没有什么区别。

相关问题