在CodeIgniter中使用.htaccess强制所有目录使用SSL,除了一个目录。

3

我意识到这类问题已经有很多,但是我认为我的情况是独特的。我想使用.htaccess强制所有内容都使用HTTPS,但对于一个名为pirate的目录,它是可选的。我以前做过类似的事情,但这次没有成功。首先,我尝试了以下代码,成功地强制所有内容使用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重定向。我知道这听起来很奇怪,但如果不是这样,我就不会问了。

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

1个回答

6
你需要为你的控制器添加一个额外的排除,或在顶部添加一个透传。因此,可以选择以下操作之一:
<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将被重定向。

它循环了!我尝试了第一个选项,它完美地工作了。现在我明白了为什么,我相信第二个选项也会起作用。非常感谢。我真的花了一整天的时间在这上面。 - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接