2012-02-02 24 views
13

Tôi đang sử dụng hai quy tắc này trong tập tin web.config của tôi:IIS URL Rewriting: Thực thi hostname & HTTP kinh điển thành HTTPS redirect

<rule name="Enforce canonical hostname" stopProcessing="true"> 
     <match url="(.*)" /> 
     <conditions> 
     <add input="{HTTP_HOST}" negate="true" pattern="^www\.example\.com$" /> 
     </conditions> 
     <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" /> 
    </rule> 
    <rule name="HTTP to HTTPS redirect" stopProcessing="true"> 
     <match url="(.*)" /> 
     <conditions> 
     <add input="{HTTPS}" pattern="off" ignoreCase="true" /> 
     </conditions> 
     <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" /> 
    </rule> 

Với hai quy tắc này tôi nhận được các Redirect sau đây để làm việc:

  1. http://www.example.com --->https://www.example.com
  2. http://example.com--->https://www.example.com
  3. https://example.com ---> này thất bại trong việc tái trực tiếp đến https://www.example.com ... Tại sao?
+0

Chỉ cần kiểm tra, có bạn chắc chắn có văn bản ngay trong mục 2 ở trên - đó http://mysite.com đổi hướng thành công với http * s *: //www.mySite.com? –

+0

Chúng không phân biệt chữ hoa chữ thường? - ở một số nơi bạn đã sử dụng mySite, trong các trang khác của mysite (ví dụ ở mục 3). –

+0

Tôi chỉ sử dụng địa chỉ www.mysite.com thay vì địa chỉ thực của tôi :) –

Trả lời

22

Không chắc chắn nếu bạn vẫn đang tìm kiếm câu trả lời nhưng ở đây. Sau khi một số tìm kiếm, và thử và sai, tôi đã tìm thấy thành công với các quy tắc sau đây. Hầu hết các ví dụ tôi gặp phải là phức tạp không cần thiết liên quan đến việc khớp mẫu và giới thiệu các biến khác ngăn các quy tắc hoạt động như dự định. Các quy tắc dưới đây có thể được áp dụng cho bất kỳ trang web, và không có gì được mã hóa cứng vì vậy nó phải luôn luôn là một thẳng sao chép và dán công việc:

<rule name="Redirect to WWW" stopProcessing="true" > 
    <match url="(.*)" /> 
    <conditions> 
     <add input="{HTTP_HOST}" pattern="^www\." negate="true"/> 
    </conditions> 
    <action type="Redirect" url="https://www.{HTTP_HOST}{HTTP_URL}" redirectType="Permanent" appendQueryString="false" /> 
</rule> 
<rule name="Redirect to HTTPS"> 
    <match url="(.*)" /> 
    <conditions> 
     <add input="{HTTPS}" pattern="OFF"/> 
    </conditions> 
    <action type="Redirect" url="https://{HTTP_HOST}{HTTP_URL}" redirectType="Permanent" appendQueryString="false" /> 
</rule> 

Hai điều cần lưu ý: redirectType = "vĩnh viễn" sẽ sẽ cho kết quả trong quy tắc được áp dụng cho đến khi lịch sử/bộ nhớ cache của trình duyệt bị dọn sạch; điều này sẽ là một điều tốt vì trình duyệt sẽ thực hiện công việc trong tương lai. Ngoài ra, appendQueryString = "false" là cần thiết vì biến máy chủ {HTTP_URL} đã bao gồm chuỗi truy vấn đầy đủ; theo mặc định, tùy chọn là "true" và sẽ dẫn đến truy vấn trùng lặp ở đây.

+0

Đây là giải pháp tốt nhất mà tôi đã tìm thấy. Hầu hết các ví dụ khác đều khó mã hóa tên miền, nhưng cái này thì không, vì thế nó mạnh hơn rất nhiều. –

+0

tuyệt vời! cảm ơn –

5

Nếu đó là vì lợi ích của bất kỳ ai, đây là điều tương tự thu được chỉ với một quy tắc:

<rule name="Redirect HTTP to HTTPS and non-WWW to WWW" stopProcessing="true"> 
    <match url="(.*)"/> 
    <conditions trackAllCaptures="false" logicalGrouping="MatchAny"> <!-- match non-HTTPS or non-WWW --> 
     <add input="{HTTPS}" pattern="^OFF$"/> <!-- if connection not secure --> 
     <add input="{HTTP_HOST}" matchType="Pattern" ignoreCase="true" pattern="^example\.com$" /><!-- domain is not canonical --> 
    </conditions> 
    <action type="Redirect" url="https://www.example.com{HTTP_URL}" redirectType="Permanent" appendQueryString="false"/> 
</rule> 
Các vấn đề liên quan