我意识到在这些方面存在很多问题,但此时我已经阅读了几乎所有这些问题,我认为我的情况是独一无二的。
我基本上是尝试使用.htaccess强制为所有内容强制使用HTTPS,但是对于一个目录(称为盗版)来说它是可选的。我以前做过这样的事情,但这次没合作。首先,我开始使用此代码,该代码成功地强制所有内容都使用HTTPS。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
RewriteCond $1 !^(blog|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]
</IfModule>
<IfModule !mod_rewrite.c>
ErrorDocument 404 /index.php
</IfModule>
然后我添加了异常(我在这里只展示了第一条规则):
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} !^(/pirate/) [NC]
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
应该这样做!所有控制器都应该转到HTTPS:
1) http://www.mysite.com/contact/ -> https://www.mysite.com/contact
检查。我的盗版控制器也应该能够做HTTPS:
2) https://www.mysite.com/pirate/ -> https://www.mysite.com/pirate/
没有变化。完善!最后,盗版控制器应该能够做好旧的HTTP:
3) http://www.mysite.com/pirate/ -> https://www.mysite.com/index.php?/pirate/
那不对。它仍然强制HTTPS,它停止隐藏index.php。总而言之,我有两个条件和规则。似乎第一个条件为真,第二个条件为假,则应用规则,然后应用第二个规则,然后返回301重定向。我知道这听起来很奇怪,但如果不是我就不会问。
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:6)
您需要为控制器添加其他排除项,或在顶部添加passthrough。所以:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} !^/pirate/ [NC]
RewriteCond %{REQUEST_URI} !^/index\.php [NC]
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
RewriteCond $1 !^(blog|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]
</IfModule>
或
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} !^/pirate/ [NC]
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
RewriteCond $1 !^(blog|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]
</IfModule>
重定向发生的原因是重写引擎循环。在原始URI被路由到index.php
之后,重写引擎再次循环并且应用重定向规则并且路由的URI被重定向。