Apache 将 domain.com 重定向到 www.domain.com

Apache 将 domain.com 重定向到 www.domain.com

我想将 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 感知)负载均衡器之后。

相关内容