【问题标题】:Forcing SSL for all but one directory in CodeIgniter with .htaccess使用 .htaccess 对 CodeIgniter 中除一个目录外的所有目录强制使用 SSL
【发布时间】:2013-09-04 04:24:16
【问题描述】:

我意识到在这些方面存在很多问题,但在这一点上,我已经阅读了几乎所有问题,我认为我的情况是独一无二的。

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

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

【问题讨论】:

    标签: php apache .htaccess codeigniter ssl


    【解决方案1】:

    您需要为控制器添加额外的排除项,或在顶部添加直通。所以要么:

    <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 被重定向。

    【讨论】:

    • 循环播放!我尝试了第一个选项,并且效果很好。现在我明白了为什么我确信第二个也会起作用。非常感谢。我真的花了一整天的时间。
    猜你喜欢
    • 2022-01-07
    • 2010-10-29
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多