我想将 domain.com 重定向至www.域名.com在 apache 中。但是当我尝试按照以下配置时,它得到了双重重定向www.www.domain.com
<VirtualHost *:80>
DocumentRoot /var/www/master/public_html
ServerName www.domain.com
ServerAlias domain.com
RewriteEngine On
RewriteRule ^(/www/.*) /www/domain.com$1
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://www.%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
<VirtualHost *:443>
DocumentRoot /var/www/master/public_html
ServerName www.domain.com
ServerAlias domain.com
ServerPath /var/www/master/public_html
RewriteEngine On
RewriteRule ^(/www/.*) /www/domain.com$1
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{REQUEST_URI} (?i)(.*)(\.jpe?g|\.png)$
RewriteCond %{DOCUMENT_ROOT}%1.webp -f
RewriteRule (?i)(.*)(\.jpe?g|\.png)$ %1\.webp [L,T=image/webp,R]
SSLEngine On
ServerSignature On
SSLCertificateFile /etc/ssl/certs/star_domain_com_05_2020.crt
SSLCertificateKeyFile /etc/ssl/private/star_domain_com_05_2020.key
SSLCertificateChainFIle /etc/ssl/certs/DigiCertCA.crt
</VirtualHost>
这里出了什么问题?
此 EC2 位于 ELB 后面,ELB 前端有 CloudFront,用于提供来自 S3 的静态内容。在 Cloudfront 中,我已设置查看器协议策略:
Redirect HTTP to HTTPS
答案1
对于您要做的事情来说,这似乎有点过度设计了。如果您想要的只是将请求example.com
发送至 301 重定向,www.example.com
那么以下方法应该可行。
<VirtualHost *:80>
DocumentRoot /var/www/master/public_html
ServerName www.example.com
ServerAlias example.com
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule . https://www.example.com%{REQUEST_URI} [L,R=301]
</VirtualHost>
其工作原理是,端口 80 上的虚拟主机将仅接收请求中的主机标头为 或www.example.com
的请求example.com
。然后 mod_rewrite 检查主机标头是否等于example.com
,它以不区分大小写的方式执行此操作。如果条件匹配,则调用重写规则,向客户端发送 301 重定向,告诉它向 发出相同的请求www.example.com
。
我不确定您想用 SSL 做什么,您可能需要将其复制到 SSL VirtualHost 中,并在 :80 主机中添加一些验证,以防您有一个与 https 匹配的 X-Forwarded-Proto 标头,这表明请求位于执行 SSL 卸载的第 7 层(http 感知)负载均衡器之后。