2016-01-22 36 views
12

Tôi có một ứng dụng ASP.NET với một bộ lọc dây lên trong RegisterGlobalFilters mà thực hiện như sau:ASP.NET MVC: Lập trình thiết lập tiêu đề HTTP trên nội dung tĩnh

public class XFrameOptionsAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(System.Web.Mvc.ResultExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.AddHeader("X-FRAME-OPTIONS", "SAMEORIGIN"); 
    } 
} 

Nhìn ở Fiddler, tôi có thể thấy rằng quan điểm được trả về từ máy chủ web bao gồm tiêu đề này. Tuy nhiên, các tệp tĩnh, chẳng hạn như JavaScript không bao gồm tiêu đề này trong phản hồi HTTP.

Làm cách nào để có được ASP.NET MVC cũng áp dụng bộ lọc này cho bất kỳ tệp tĩnh nào mà máy chủ web trả về?

+1

Điều này không liên quan gì đến bộ lọc API web @ DeblatonJean-Philippe – Tommy

Trả lời

10

Một cách để đặt tiêu đề cho tất cả nội dung của trang web nằm trong web.config. Phần customHeaders sẽ đảm bảo rằng tiêu đề này được bao gồm cho tất cả các tệp và phản hồi.

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="X-FRAME-OPTIONS" value="SAMEORIGIN" /> 
     </customHeaders> 
    </httpProtocol> 
    </system.webServer> 

Tùy chọn khác là tạo tùy chỉnh HttpModule như được hiển thị bên dưới. Bằng cách này, bạn có nhiều quyền kiểm soát hơn đối với các tệp và nội dung mà các tiêu đề cần được nối thêm.

namespace MvcApplication1.Modules 
{ 
    public class CustomOriginHeader : IHttpModule 
    { 
     public void Init(HttpApplication context) 
     { 
      context.PreSendRequestHeaders += OnPreSendRequestHeaders; 
     } 

     public void Dispose() { } 

     void OnPreSendRequestHeaders(object sender, EventArgs e) 
     { 
      // For example - To add header only for JS files 
      if (HttpContext.Current.Request.Url.ToString().Contains(".js")) 
      { 
       HttpContext.Current.Response.Headers.Add("X-FRAME-OPTIONS", "SAMEORIGIN"); 
      } 
     } 
    } 
} 

Và sau đó đăng ký chúng trong web.config như hình dưới đây -

<system.webServer> 
    <modules> 
     <add name="CustomHeaderModule" type="MvcApplication1.Modules.CustomOriginHeader" /> 
    </modules> 
    </system.webServer> 
+1

Tôi đã nghĩ về việc này, nhưng nếu tôi có kịch bản nơi tôi muốn thêm tiêu đề cụ thể vào * các tệp tĩnh * nhất định. – codechurn

+1

Tôi cũng đã cập nhật câu trả lời của mình bằng cách lập trình để thêm tiêu đề, kiểm tra. – ramiramilu

4

Đây là điều mà nếu bạn muốn trên mọi yêu cầu (yêu cầu tĩnh hoặc động), có lẽ bạn nên thiết lập nó qua IIS (máy chủ web). Dưới đây là một số chi tiết về cách thức khác nhau mà bạn có thể đạt được điều này - http://www.iis.net/configreference/system.webserver/httpprotocol/customheaders

Nói tóm lại, bạn có thể làm điều này trong tập tin web.config của bạn

<configuration> 
    <system.webServer> 
     <httpProtocol> 
     <customHeaders> 
      <add name="X-Custom-Name" value="MyCustomValue" /> 
     </customHeaders> 
     </httpProtocol> 
    </system.webServer> 
</configuration> 

Nếu bạn có quyền truy cập trực tiếp đến IIS, bạn có thể sử dụng Giao diện người dùng để thiết lập điều này là tốt.

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