使用.htaccess强制CodeIgniter中除一个目录外的所有目录使用SSL



我意识到有很多问题,但在这一点上,我几乎读遍了所有问题,我认为我的情况是独一无二的。

我基本上是在尝试使用.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重定向。我知道这听起来很奇怪,但如果不是,我就不会问了。

为什么会发生这种情况,我该如何解决?

您需要为控制器添加一个额外的排除,或者在顶部添加一个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被重定向。

相关内容

最新更新