htaccess 使用 CloudFlare 嗅探器将任何域重写为 www+SSL

htaccess rewrite any domain to www+SSL with CloudFlare sniffer

我 运行 几个 Wordpress-based 网站通过 CloudFlare 获得反向代理。我想将裸域(但不是子域!)重定向到 'www.domain',如果启用了 CloudFlare,则强制执行 SSL(重定向到 'https://')。但是如果 CloudFlare 被禁用,那么它应该只通过标准 HTTP 重定向到 'www'。

请注意,这应该通过尽可能少的重定向来实现,以尽量减少请求的数量。此外,该代码应该可以在任何域中重复使用。

To-date,我想出了下面的代码 - 但它有一个问题,在下面。

# BEGIN Redirect to www & SSL
    RewriteEngine On
# If CloudFlare headers are not set, rewrite bare domain to 'www':
    RewriteCond %{HTTP:CF-Visitor} !=='"scheme":"http"'
    RewriteCond %{HTTP:CF-Visitor} !=='"scheme":"https"'
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule .* http://www\.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# If CloudFlare headers are set, rewrite bare domain to 'www' via SSL:
    RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"' [OR]
    RewriteCond %{HTTP:CF-Visitor} '"scheme":"https"'
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule .* https://www\.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# If CloudFlare headers are set, rewrite non-SSL to SSL:
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# END Redirect to www & SSL

这似乎在浏览器中有效,但 header 嗅探器显示不可接受的数字或重定向。我正在使用 Web-sniffer,它显示请求首先将 301 重定向到 www,然后再将 301 重定向到 SSL。不知道为什么,但这通常应该进入一个 301 重定向 - 直接到“https://www”。

另外,我对我的 CloudFlare 嗅探器不是很确定。

任何建议将不胜感激。

试试:

# BEGIN Redirect to www & SSL
    RewriteEngine On
# If CloudFlare headers are not set, rewrite bare domain to 'www':
    RewriteCond %{HTTP:CF-Visitor} !scheme
    RewriteCond %{HTTP_HOST} ^[^.]+\..{2,6}$
    RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# If CloudFlare headers are set, rewrite bare domain to 'www' via SSL:
    RewriteCond %{HTTP:CF-Visitor} scheme
    RewriteCond %{HTTP_HOST} ^[^.]+\..{2,6}$
    RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# If CloudFlare headers are set, rewrite non-SSL to SSL:
    RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# END Redirect to www & SSL