2010-07-22 23 views
16

Tôi có một dự án khách hàng nơi tôi cần phải buộc HTTPS cho một thư mục nhất định và buộc HTTP cho tất cả các thư mục khác. Tôi có thể thực thi thành công HTTPS cho thư mục mà tôi mong muốn nhưng sau đó tất cả các liên kết quay lại phần còn lại của trang web sẽ kết thúc bằng HTTPS. Tôi muốn có một quy tắc mà buộc các yêu cầu cho bất cứ điều gì 'không' trong thư mục an toàn để được buộc trở lại HTTP. Dưới đây là những gì tôi có cho đến thời điểm này:Buộc HTTPS trên một số URL nhất định và buộc HTTP cho tất cả các URL khác

RewriteEngine On 
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC] 

RewriteCond %{HTTPS} !=on 
RewriteRule ^(my) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 

'my' là tên của thư mục mà tôi cần để buộc HTTPS.

Bất kỳ ý tưởng nào?

Cập nhật: Tôi cũng đã cố gắng:

RewriteEngine On 
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC] 

# Force HTTPS for /my 
RewriteCond %{HTTPS} !=on 
RewriteRule ^(my) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L] 

# Force HTTP for anything which isn't /my 
RewriteCond %{HTTPS} =on 
RewriteRule !^my http://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L] 

# Remove index.php from URLs 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 

Nhưng thay vì yêu cầu/my bị buộc phải thông qua HTTPS họ bây giờ chỉ cần giải quyết để http://www.example.com/index.php/my

:?

Trả lời

16

Ah, tất nhiên. Vấn đề nằm trong thực tế là ruleset viết lại của bạn sẽ được tái xử lý sau khi nó được chuyển thành index.php theo chuyển hướng ban đầu. Sử dụng những gì bạn đang có, bạn cần thêm điều kiện chuyển hướng để đảm bảo chúng không được áp dụng sau khi viết lại thành /index.php/my.

giống như sau nên làm:

RewriteEngine On 
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC] 

# Force HTTPS for /my 
RewriteCond %{HTTPS} !=on 
RewriteCond %{THE_REQUEST} ^[A-Z]+\s/my [NC] 
RewriteRule ^(my) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L] 

# Force HTTP for anything which isn't /my 
RewriteCond %{HTTPS} =on 
RewriteCond %{THE_REQUEST} !^[A-Z]+\s/my [NC] 
RewriteRule !^my http://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L] 

# Remove index.php from URLs 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 
+0

Cảm ơn, đã cứu tôi rất nhiều thời gian! FWIW, trong Wordpress, Wordpress htaccess cơ bản IfModule đã loại bỏ index.php khỏi URL. – Jason

0

Chỉ cần đảo ngược các điều kiện:

RewriteCond %{HTTPS} =on 
RewriteRule !^my http://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L] 
+0

Hi ya, nhờ trả lời nhanh chóng. Tôi đã thử điều đó nhưng tôi không chắc chắn nơi để đặt nó trong dòng chảy của các quy tắc hiện tại của tôi, bất kỳ con trỏ? Nếu tôi đặt nó ở trên quy tắc 'Force HTTPS' hiện tại, nó ngăn không cho 'Force HTTPS' hoạt động và cũng ngăn chặn quy tắc cuối cùng viết lại index.php khi thực thi. :? –

+0

@Nathan Pitman: Không, vì chúng có các điều kiện đối sánh khác nhau nên chúng không tương tác. – Gumbo

+0

ok, tôi đã thử những gì bạn đề xuất (xem bản cập nhật cho bài đăng gốc của tôi) nhưng điều này không hiệu quả. Tôi có thể thấy rằng nó 'nên' nhưng tôi nghĩ rằng tôi có thể có các quy tắc theo thứ tự sai hoặc quy tắc nhất định đang gây ra việc viết lại để chấm dứt trước khi các điều kiện và quy tắc khác có thể được đánh giá ...:/ –

1

Đây là một cái gì đó mà làm việc từ một trang web khách hàng cũ và có thể thích nghi cho các mục đích của bạn:

#If https off and in the cart dir 
RewriteCond %{HTTPS} =off [NC] 
RewriteCond %{REQUEST_URI} ^/cart/(.*) [NC] 
RewriteRule ^(.*)$ https://%{HTTP_HOST}/cart/%1 [R=301,L] 

#If https on and not in cart dir  
RewriteCond %{HTTPS} =on 
RewriteCond %{REQUEST_URI} !^/cart [NC] 
#Above line actually used to read RewriteCond %{REQUEST_URI} !^/cart|media|images|thumbs|css|js [NC] 
#to allow js/css/images to be served so there were no mixed ssl messages popping up to visitors 
RewriteCond %{REQUEST_FILENAME} !index\.php$ [NC] 
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 

Thay giỏ hàng với lẽ tôi

4

Hãy thử những điều sau đây, hãy làm việc cho bạn:

RewriteEngine On 

RewriteCond %{HTTPS} off 
RewriteCond %{REQUEST_URI} ^/my 
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] 

RewriteCond %{HTTPS} on 
RewriteCond %{REQUEST_URI} !^/my 
RewriteRule ^(.*)$ http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] 
Các vấn đề liên quan