Apache 跨数千个规则条目强制执行HTTPS

Apache 跨数千个规则条目强制执行HTTPS,apache,.htaccess,redirect,mod-rewrite,Apache,.htaccess,Redirect,Mod Rewrite,社区。我正在迁移一个古老的ColdFusion站点(说真的),我们从旧版本的页面(如 index.cfm?id=1&this=that 给更合理的同行,比如 /what-this-page-really-is 谷歌说要把它们一个一个地列出来,所以这就是我正在做的。然而,在所有这些重定向上,我们还希望强制使用HTTPS。我们现在得到的是: RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1

社区。我正在迁移一个古老的ColdFusion站点(说真的),我们从旧版本的页面(如

index.cfm?id=1&this=that 
给更合理的同行,比如

/what-this-page-really-is
谷歌说要把它们一个一个地列出来,所以这就是我正在做的。然而,在所有这些重定向上,我们还希望强制使用HTTPS。我们现在得到的是:

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteRule ^thing.cfm$ /thing/? [R=301,L,NC]
RewriteCond %{QUERY_STRING} id=1 [NC]
RewriteRule ^blah.cfm$ /awesome-sauce/? [R=301,L,NC]
它工作得很好,但谷歌抱怨说,从技术上讲,这是对这些旧链接的两个重定向。一种可能的解决方案是将*.cfm文件从HTTPS重定向中排除,并显式地将每个*.cfm重定向转到页面的HTTPS版本,如下所示:

RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} !(.*)cfm$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteRule ^thing.cfm$ https://%{HTTP_HOST}/thing/? [R=301,L,NC]
RewriteCond %{QUERY_STRING} id=1 [NC]
RewriteRule ^blah.cfm$ https://%{HTTP_HOST}/awesome-sauce/? [R=301,L,NC]
但是在数千行中,.htaccess文件中有很多额外的字符。我知道这在apache配置中更好,但我现在没有这个选项

我的问题:有没有办法设置一个将HTTPS参数应用于所有后续*.cfm 301重定向的标志


谢谢大家!

您可以在每个301处理程序中移动底部的
http->https
规则,并从重定向标志中删除
R
标志,而不是强制执行
https://
,以便Google(或任何外部客户端)只获得一个重定向

RewriteEngine On

RewriteRule ^thing\.cfm$ /thing/? [L,NC]

RewriteCond %{QUERY_STRING} id=1 [NC]
RewriteRule ^blah\.cfm$ /awesome-sauce/? [L,NC]

# all other rules here but remove R=301 flag

# finally do a http->https with rewritten URI
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L,NE]

测试前请确保清除浏览器缓存。

这非常有意义。我从未想过我可以在L(ast)标志之后执行另一个重写规则。谢谢你的建议。这个解决方案不仅实现了我的主要目标,而且我还减少了大约5%的文件大小,去掉了那些R=301s!