2011-02-09 63 views
37

Tôi cần chuyển hướng trang web HTTP của mình sang HTTPS, đã thêm quy tắc bên dưới nhưng tôi nhận được 403 Lỗi khi cố gắng sử dụng http://www.example.com, nó hoạt động tốt khi tôi nhập https://www.example.com trình duyệt.Cách chuyển hướng HTTP sang HTTPS trong ứng dụng MVC (IIS7.5)

<system.webServer> 
    <rewrite> 
     <rules> 
      <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> 
     </rules> 
    </rewrite> 
</system.webServer> 
+0

Dưới quy tắc? Ý anh là gì? –

+0

Tôi đã thêm quy tắc sử dụng mô-đun "URL rewirte" trong IIS và trong web.config. – LLM

Trả lời

99

Bạn có thể làm điều đó trong mã:

Global.asax.cs

protected void Application_BeginRequest(){ 
    if (!Context.Request.IsSecureConnection) 
     Response.Redirect(Context.Request.Url.ToString().Replace("http:", "https:")); 
} 

Hoặc Bạn có thể thêm mã cùng với một bộ lọc hành động:

public class SSLFilter : ActionFilterAttribute { 

    public override void OnActionExecuting(ActionExecutingContext filterContext){ 
     if (!filterContext.HttpContext.Request.IsSecureConnection){ 
      var url = filterContext.HttpContext.Request.Url.ToString().Replace("http:", "https:"); 
      filterContext.Result = new RedirectResult(url); 
     } 
    } 
} 
+0

Tôi đã thử lỗi tương tự nhưng 403 bị cấm. – LLM

+0

Di chuyển logic chuyển hướng của tôi sang Application_BeginRequest() đã giải quyết được sự cố tôi đang gặp phải nơi tôi đang cố thực hiện chuyển hướng dựa trên URL đã nhập. – farina

+0

Application_BeginRequest() hoạt động hoàn hảo cho tôi, cảm ơn. –

3

tôi sử dụng thông tin sau trong Global.asax:

protected void Application_BeginRequest() 
{ 
    if (FormsAuthentication.RequireSSL && !Request.IsSecureConnection) 
    { 
    Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://")); 
    } 
} 
1

tôi đã làm nó thusly, kể từ khi một phiên debug địa phương sử dụng số tùy chỉnh cổng:

protected void Application_BeginRequest() 
    { 
     if (!Context.Request.IsSecureConnection) 
     { 
      if (HttpContext.Current.Request.IsLocal) 
      { 
       Response.Redirect(Context.Request.Url.ToString().Replace("http://localhost:25885/", "https://localhost:44300/")); 
      } 
      else 
      { 
       Response.Redirect(Context.Request.Url.ToString().Replace("http://", "https://")); 
      } 
     } 
    } 

Tốt sẽ có một số cách để có được URL và URL SSL lập trình ...

2

Bạn có thể sử dụng RequireHttpsAttribute cho các trường hợp đơn giản.

[RequireHttps] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Như đã nêu trong MSDN ...

"Đại diện cho một thuộc tính rằng buộc một yêu cầu HTTP không có bảo đảm là được gửi lại qua HTTPS."

RequireHttpsAttribute

Tôi không chắc chắn bạn muốn sử dụng để thực thi HTTPS trên một trang web lớn mặc dù. Rất nhiều trang trí để làm, và cơ hội để bỏ lỡ bộ điều khiển.

+1

không hoạt động nếu bạn có childactions (renderaction) ;-) – juFo

+0

Điểm tốt, nó sẽ làm gì trong trường hợp đó? – Nattrass

+0

Chỉ gặp sự cố. "Hành động con không được phép thực hiện các hành động chuyển hướng." "Chi tiết ngoại lệ: System.InvalidOperationException: Hành động con không được phép thực hiện các hành động chuyển hướng". – juFo

3

This bài giải thích rất tốt cách chuyển hướng tất cả các yêu cầu tới HTTPS.

15

Trong Global.asax.cs:

đơn giản chuyển hướng

protected void Application_BeginRequest() 
{ 
    if (!Context.Request.IsSecureConnection 
     && !Context.Request.Url.ToString().StartsWith("http://localhost:") // to avoid switching to https when local testing 
     ) 
    { 
     // Only insert an "s" to the "http:", and avoid replacing wrongly http: in the url parameters 
     Response.Redirect(Context.Request.Url.ToString().Insert(4, "s")); 
    } 
} 

301 redirect (SEO thực hành tốt nhất)

Các chuyển hướng 301 Moved Permanently được coi là một thực hành tốt nhất cho việc nâng cấp cho người dùng HTTP để HTTPS (see Google recommendations).

Vì vậy, nếu Google hoặc Bing robot sẽ được chuyển hướng quá, xem xét việc này:

protected void Application_BeginRequest() 
{ 
    if (!Context.Request.IsSecureConnection 
     && !Context.Request.Url.ToString().StartsWith("http://localhost:") // to avoid switching to https when local testing 
     ) 
    { 
     Response.Clear(); 
     Response.Status = "301 Moved Permanently"; 
     Response.AddHeader("Location", Context.Request.Url.ToString().Insert(4, "s")); 
     Response.End(); 
    } 
} 
+2

Nên được chọn trả lời IMO, không phải là tôi mong đợi OP quay lại sau 5 năm. – Sinjai

+0

@Matthieu Charbonnier Cảm ơn rất nhiều –

+2

Tôi đồng ý với bài đăng ở trên - câu trả lời này phải được chọn –

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