2009-02-25 5 views
19

Khi tôi đang ở một phần an toàn của trang web tôi đang phát triển (nhập một trang hoặc thư mục cụ thể bằng https), các liên kết tương đối với các trang bình thường cũng được tự động chuyển sang https.Cách ngắn để liên kết tới http từ https (và ngược lại) bằng cách sử dụng các liên kết tương đối

Có cách nào để thông báo cho < một thẻ > để luôn sử dụng giao thức http thay vì giao thức https (hay cách khác)?

Tôi biết dễ dàng khi sử dụng liên kết hoàn chỉnh (http://www.mysite.com/index.html hoặc https://www.mysite.com/index.html), nhưng tôi muốn nó hoạt động với các liên kết tương đối (index.html, ../index.html, v.v.).

Trả lời

10

Chúng tôi sử dụng Apache mod_rewrite để kiểm soát xem trang có được phân phối qua http hoặc https hay không. Dưới đây là một đoạn mã ví dụ từ tập tin thư mục gốc .htaccess của trang web:

# Redirect most reqests for https to http 
RewriteRule ^https://www.example.com(.*) http://www.example.com$1 [R=301,NC] 

# Allow some URIs to be https if requested 
RewriteCond %{SERVER_PORT} ^443$ 
RewriteCond %{REQUEST_URI} !^/images/(.*)$ 
RewriteCond %{REQUEST_URI} !^/scripts/(.*)$ 
RewriteCond %{REQUEST_URI} !^/styles/(.*)$ 
RewriteCond %{REQUEST_URI} !^/store(.*)$ 
RewriteCond %{REQUEST_URI} !^/login.htm$ 
RewriteRule ^(.*) http://www.example.com/$1 [L,R] 

# Force some URIs to be https only 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteRule ^store(.*) https://www.example.com/store$1 [L,R] 

RewriteCond %{SERVER_PORT} ^80$ 
RewriteRule ^FormSanityKey.htm https://www.example.com/login$1 [L,R] 

Đọc tất cả về nó tại địa chỉ:

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

+0

+1 cho cụm từ, nhắc tôi nhớ về cậu bé tin tức trong Spaceship Earth :) – Niloct

2

Có vẻ như bạn muốn sử dụng the BASE element.

Không có cách nào để 'cho biết' một Anchor sử dụng một giao thức cụ thể hay không, ít nhất là không sử dụng phần tử BASE trong HEAD của trang đó.

Có lý do nào bạn muốn sử dụng liên kết tương đối trên các liên kết tuyệt đối không? This article nói về lỗ hổng của việc sử dụng các liên kết tương đối với HTTPS - tiềm năng để trang web của bạn được lập chỉ mục kép và như vậy.

+2

Cảm ơn. Phần tử cơ sở sẽ ảnh hưởng đến tất cả các liên kết trên trang và sẽ có cả hai loại trên cùng một trang (http và https). Tôi cũng thích liên kết tương đối bởi vì nó làm cho cuộc sống (thử nghiệm, vv ...) trên một kết nối internet chậm dễ dàng hơn rất nhiều và tôi có thể kiểm tra các trang web trong các thư mục trên máy chủ. – jeroen

+1

Lập chỉ mục kép trang web của bạn? Nó không phải là một vấn đề của máy lập chỉ mục? Giống như - họ không kiểm tra các tập tin cho nội dung giống hệt nhau?Tôi không hỗ trợ đặt ra "quy tắc" cho quản trị viên web dựa trên công cụ tìm kiếm làm việc sai ở một thời điểm cụ thể nào (có thể khác với hành vi tương lai của họ). –

4

Không chắc nếu điều này là chính xác những gì bạn đang tìm kiếm, nhưng nếu bạn đang sử dụng Apache, có một mẹo bạn có thể sử dụng để làm điều này: http://httpd.apache.org/docs/2.2/ssl/ssl_faq.html#relative

Về cơ bản bạn đặt sau đây trong tập tin cấu hình Apache của bạn:

RewriteEngine on 
RewriteRule ^/(.*):SSL$ https://%{SERVER_NAME}/$1 [R,L] 
RewriteRule ^/(.*):NOSSL$ http://%{SERVER_NAME}/$1 [R,L] 

sau đó nối :SSL cho bất kỳ liên kết (trong trang web) mà bạn muốn để buộc HTTPS, và :NOSSL cho bất kỳ liên kết mà bạn muốn để buộc thường xuyên HTTP.

+0

Rất tốt, cảm ơn, tôi nghĩ tôi sẽ thử. – jeroen

2

Không có cách nào để làm điều này với các siêu liên kết tương đối khi bạn đang sử dụng một giao thức khác, nó sẽ không khác với liên kết đến vị trí ftp.

+1

Nó chỉ là một shortcomming của cú pháp URL/URI. Tôi có thể dễ dàng tưởng tượng một thế giới mà bạn có thể có một liên kết với đường dẫn tương đối, nhưng giao thức tuyệt đối (như trong "giữ phần còn lại, thay đổi đường dẫn và giao thức"), giống như chúng ta có liên kết giao thức tương đối ("giữ giao thức, thay đổi mọi thứ đến sau"). Chúng tôi chỉ xảy ra không sống trong thế giới này. –

27

Bạn có thể làm cho tất cả các liên kết nội bộ của bạn được giao thức độc lập bằng cách sử dụng cú pháp sau :

<a href="//some/file/on/your/domain.php">link text</a>

thay vì

<a href="some/file/on/your/domain.php">link text</a>

// sẽ làm cho liên kết tôn trọng bất kỳ giao thức nào được tải lên.

+1

Cảm ơn câu trả lời của bạn. Tôi đã không thử nó, nhưng bình thường, liên kết tương đối luôn luôn làm theo các giao thức mà trang gốc đã được nạp hơn, vì vậy điều này sẽ không thay đổi bất cứ điều gì. Bên cạnh đó tôi muốn cụ thể - tương đối - các trang và thư mục để tải qua https và những người khác trên http. – jeroen

+0

Xin lỗi, tôi đã đọc sai câu hỏi của bạn. Tôi vừa quay lại và đọc nó và nó thực sự không áp dụng. – Matthew

+4

Bắt đầu một URI có hai dấu gạch chéo là "tham chiếu đường dẫn mạng" và hoạt động như mô tả Matt ** miễn là bạn chỉ định miền **. Bạn không thể sử dụng cú pháp này cho các tệp cục bộ như ví dụ có vẻ như chỉ ra (trình duyệt sẽ cố gắng giải quyết "một số" như thể nó là một tên miền). Xem [URI bắt đầu bằng hai dấu gạch chéo ... chúng hoạt động như thế nào?] (Http://stackoverflow.com/questions/4071117/uri-starting-with-two-slashes-how-do-they-behave) – Rudi