2011-12-14 39 views
12

Tôi đang sử dụng CodeIgniter và sau these instructions để buộc ssl nhưng tất cả yêu cầu được chuyển hướng đếnBuộc https: // www. cho CodeIgniter trong htaccess với mod_rewrite

http://staging.example.com/index.php/https:/staging.example.com 

My .htaccess là:

### Canonicalize codeigniter URLs 

# Enforce SSL https://www. 
RewriteCond %{HTTPS} !=on 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

### 
# Removes access to the system folder by users. 
# Additionally this will allow you to create a System.php controller, 
# previously this would not have been possible. 
# 'system' can be replaced if you have renamed your system folder. 
RewriteCond %{REQUEST_URI} ^system.* 
RewriteRule ^(.*)$ /index.php/$1 [L] 

# Checks to see if the user is attempting to access a valid file, 
# such as an image or css document, if this isn't true it sends the 
# request to index.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L] 
+0

Câu chuyện hay! Câu hỏi là gì? SO! = Debug-it-for-me.com –

Trả lời

16

Tôi nghĩ rằng, thay vì

RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

bạn nên có một cái gì đó như

RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

không có quy tắc so khớp quy tắc viết lại. Liên kết của bạn hiện được sản xuất theo quy tắc thứ ba.

18

Bạn có thể làm điều đó bằng mã thay vì sử dụng htaccess.

Bạn có thể tạo chức năng trợ giúp để chuyển hướng trang vượt quá SSL, mà bạn gọi từ bộ điều khiển của mình.

Trong trợ giúp của bạn;

function force_ssl() { 
    if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") { 
     $url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; 
     redirect($url); 
     exit; 
    } 
} 

Sau đó, trong bộ điều khiển của bạn;

class Whatever extends CI_Controller { 

    function __construct() { 
     parent::__construct(); 
     $this->load->helper(array('your_ssl_helper')); 
    } 

    public function index() { 
     force_ssl(); 
     ... 
    } 
} 
+2

Từ quan điểm của tôi, giao thức là thứ mà máy chủ cần xử lý mà không cần ứng dụng có bất kỳ thứ gì với nó, nếu có thể (tôn trọng các yêu cầu ứng dụng). Khách hàng có thể sử dụng HTTP hoặc HTTPS hoặc thậm chí [SPDY] (https://en.wikipedia.org/wiki/SPDY). – feeela

+0

Tôi nghĩ đây là một giải pháp rất thanh lịch cho CI. Mặc dù tôi có thể đánh giá cao quan điểm của Feeela, tôi thấy rằng việc kiểm soát điều này từ bên trong ứng dụng của bạn là phù hợp với quy trình và phong cách công việc của CI. Tương tự, các tác vụ .htaccess phổ biến khác được xử lý bằng tính năng định tuyến của CI. –

+0

Tôi cần thay đổi hằng số từ $ _SERVER ['HTTPS']! = "On" thành $ _SERVER ['HTTPS']! = "1" để làm việc này trong hệ thống của tôi. – YudhiWidyatama

7

Sử dụng này

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

thay vì

RewriteCond %{HTTPS} !=on 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
+1

Lưu cuộc sống của tôi: D –

0

Có lẽ bạn có RewriteEngine On ở đâu đó trên mã này ...

RewriteCond %{REQUEST_URI} ^system.* 

có thể sẽ không được kích hoạt. REQUEST_URI nên bắt đầu với/(không giống như RewriteRule), vì vậy bạn có thể muốn

RewriteCond %{REQUEST_URI} ^/system 

Tôi không chắc rằng

RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

đáng tin cậy sẽ phù hợp với ^. Tôi sẽ thử các cách sau:

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

Ngẫu nhiên, HTTP_HOST thường là bất kỳ khách truy cập nào nhập vào, vì vậy, www. không được đảm bảo, nếu đó là những gì bạn muốn. Bạn sẽ cần một bước riêng để buộc www ..

0

Tôi đã viết lớp sau cho mục đích này. Tôi thích có những thứ như thế này trong mã trên một tệp cấu hình, do đó hành vi không thể được sửa đổi bởi cấu hình không đúng (tức là một trang thực sự là "bắt buộc" đối với SSL).

Chức năng phải được gọi ở giai đoạn đầu trong quá trình tải trang web của bạn.

class SecurityHelper extends MX_Controller 
{ 
    // CONTROLLERS FORCED TO SSL 
    private $arrHttps = array(
     'products/shipping', 
     'products/billing' 
    ); 

    // CONTROLLERS ACCESSIBLE FROM BOTH 
    private $arrAgnostic = array (
     'products/getcart' 
    ); 

    function redirectSsl() 
    { 
     // SSL MODULES 
     if(in_array(uri_string(), $this->arrHttps)) 
     { 
      // ONLY REDIRECT IF NECESSARY 
      if ($_SERVER['HTTPS'] != "on") 
      { 
       // REDIRECTING TO SSL 
       $newUrl = str_replace('http://', 'https://', base_url($_SERVER['REQUEST_URI'])); 
       redirect($newUrl); 
      } 
     } 
     // NON-SSL MODULES 
     else 
     { 
      // IF AGNOSTIC, DON'T REDIRECT 
      if(in_array(uri_string(), $this->arrAgnostic)) 
       return; 

      // ONLY REDIRECT IF NECESSARY 
      if ($_SERVER['HTTPS'] == "on") 
      { 
       $newUrl = str_replace('https://', 'http://', base_url($_SERVER['REQUEST_URI'])); 
       redirect($newUrl); 
      } 
     } 
    } 
} 

Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan