我将我的网站转换为ssl 。 我的htaccess目前有现有的规则,我想添加一个规则来重写所有http请求到https (这是一个共享服务器,我没有访问configuration文件,所以这是唯一的方法)。
主要的两个规则是第一个( http到https )和最后一个(移除www )。
我试图包围我的头是在这种情况下链接规则会发生什么,如果我需要[L]指令与http重命名规则的https 。 我知道[L]指令会导致一个.htaccess循环,并且如果可能的话只传递一个规则会更有效率。 如果不使用[L]指令(使用http指向https重命名规则),那么www重命名规则是否仍然能够一次传输?
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}[L,R=301] #Rules for Versioned Static Files - remove timestamp RewriteRule ^(js|js-common|css|css-common|img|img-common)/(.+)\.([0-9])+\.(js|css|php|jpg|gif|png)(.*)$ $1/$2.$4$5 [L] #rename invalid file and directory requests RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?redirectroot=%{REQUEST_URI} #direct favicon requests to img directory RewriteCond %{REQUEST_URI} !^/img/favicon.ico [NC] RewriteCond %{REQUEST_URI} favicon\.ico [NC] RewriteRule (.*) https://example.com/img/favicon.ico [R=301] # remove www. RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,QSA,NC,L]
是的, L ( last )标志是这些外部(规范)redirect所必需的。 “链接”并没有真正涉及到 – 这些是外部redirect – 您希望处理尽快停止,并将redirect响应发送回客户端。 如果你没有包含L标志,那么在redirect之前 ,处理将通过文件继续进行,并被重写到你的前端控制器 – 这当然是你不想发生的事情(因为它可能会导致外部redirect到/index.php?redirectroot=.... )。
事实上,你的指令的顺序是错误的。 作为一般规则, 外部redirect应始终在 内部重写 之前进行 。 您的规范redirect(www和HTTPS)应该放在您的文件顶部附近,而不是末尾。
另外,您的www将非wwwredirectredirect到http:// ,这与您的HTTP到HTTPSredirect直接冲突,这将创build不必要的循环。
您的HTTP到HTTPSredirect也是无效的,因为您在RewriteRule标志之前缺less一个空格。
总之:
RewriteEngine On # remove www. RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,L] RewriteCond %{HTTPS} !=on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] #direct favicon requests to img directory RewriteCond %{REQUEST_URI} !^/img/favicon.ico RewriteRule favicon\.ico /img/favicon.ico [NC,L] #Rules for Versioned Static Files - remove timestamp RewriteRule ^(js|js-common|css|css-common|img|img-common)/(.+)\.([0-9])+\.(js|css|php|jpg|gif|png)(.*)$ $1/$2.$4$5 [L] #rename invalid file and directory requests RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?redirectroot=%{REQUEST_URI}
通过在HTTPSredirect之前将您的www包含到非wwwredirect并redirect到规范https:// ,您可以避免两个潜在的redirect。
QSA标志不是必需的,除非你明确地在replace中包含一个查询string,并且你希望把它和请求上的查询string合并。 (您不包括在WWW上的查询string非wwwredirect,所以这个标志是不需要的。)
我已经改变你的redirect到/img/favicon.ico到一个内部重写 。 不知道为什么你想在这里redirect ? 我也会质疑在这里使用NC旗帜。 如果这是特别需要的,你只应该使匹配不区分大小写。
另外,我从取消的 RewriteCond指令中删除了NC标志。 想想这个逻辑。
我知道
[L]指令会导致.htaccess循环
在.htaccess (目录)上下文中, L标志终止当前通过.htaccess文件。 然而,处理确实是“循环”的,直到请求通过不变 – 除了在外部redirect( R=3xx )的情况下,立即触发。