我正在尝试在我的“游乐场” VPS 上执行虚拟主机。
我需要将 3 个或更多域重定向到主域。
它还应该重定向 HTTPS,Lets Encrypt 已配置并运行良好。
在当前状态下,此配置工作正常,但是当用户手动访问 HTTPS secsite.com(自己输入 HTTPS)时,它会首先重定向到主站点,然后再次重定向回 secsite.com。
<VirtualHost *:80>
ServerName mainsite.com
ServerAlias *.mainsite.com secsite.com *.secsite.com
RewriteRule !https:\/\/mainsite\.com https://mainsite.com%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName mainsite.com
ServerAlias *.mainsite.com secsite.com *.secsite.com
RewriteRule !https:\/\/mainsite\.com https://mainsite.com%{REQUEST_URI} [END,NE,R=permanent]
ServerAdmin webmaster@localhost
DocumentRoot /var/www/mainsite.com
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile /etc/letsencrypt/live/mainsite.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mainsite.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
知道如何完成这项工作吗?
答案1
RewriteRule !https:\/\/mainsite\.com https://mainsite.com%{REQUEST_URI} [END,NE,R=permanent]
该RewriteRule
指令仅匹配 URL 路径,而不是方案 + 主机名,正如您在此处尝试的那样。由于您已否定图案(!
前缀),它将总是成功并导致重定向循环。也就是说,如果它正在做任何事情……
您尚未启用重写引擎(即RewriteEngine On
),因此,除非在配置中较早启用它,否则这些RewriteRule
指令将被忽略。
如果您看到任何重定向,则要么您看到的是来自早期尝试的缓存响应(请注意,301 重定向由浏览器持久缓存),要么您的应用程序(或其他程序)正在触发重定向。
您的 vHost:80 (HTTP) 中的重定向应该是无条件的mod_alias Redirect
,因为您要将所有内容重定向到 HTTPS。例如:
<VirtualHost *:80>
ServerName mainsite.com
ServerAlias *.mainsite.com secsite.com *.secsite.com
Redirect 301 / https://mainsite.com/
</VirtualHost>
该Redirect
指令是前缀匹配,匹配后的所有内容都被复制到目标 URL 的末尾。例如,http://example.com/foo/bar
重定向到https://mainsite/foo/bar
。
对于 vHost:443 (HTTPS),当请求的主机名不是规范主机时,您需要重定向。为此,您需要使用附加RewriteCond
指令并检查HTTP_HOST
服务器变量。例如:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName mainsite.com
ServerAlias *.mainsite.com secsite.com *.secsite.com
RewriteEngine On
RewriteCond %{HTTP_HOST} !^mainsite\.com$
RewriteRule ^ https://mainsite.com%{REQUEST_URI} [END,NE,R=permanent]
: