如何设置 Origin 请求标头

Posted

技术标签:

【中文标题】如何设置 Origin 请求标头【英文标题】:How to set the Origin Request Header 【发布时间】:2018-03-30 04:47:44 【问题描述】:

我想向远程 API 发送 AJAX 请求。

function Gettest(CourseID) 
    var param =  "CourseID": CourseID;
    param = JSON.stringify(param);
    $.ajax(
        type: "Post",
        url: apiurl + "Course/DelCoursetargetedaudience",
        contentType: "application/json; charset=utf-8",
        data: param,
        dataType: "json",
        success: function (data) 
        ,
        error: function (response) 
        
    );
;

但我需要在发送请求之前更改源名称。

请参考下图。

【问题讨论】:

为什么要改? 感谢您的回复。我有我的生产 API。那里不允许本地主机请求。 你应该看看 CORS 让服务器允许跨域请求 是的,我也这样做了,我只允许一个来源.. 但不改变我需要发送请求 那很好......有没有办法在向服务器请求时更改来源 【参考方案1】:

简而言之:你不能。

如MDN 所述; Origin 是一个“禁止”的标头,这意味着您不能以编程方式更改它。

您需要配置 Web 服务器以允许 CORS 请求。

要启用 CORS,请将其添加到您的 Web.config

<system.webServer>   
    <!-- Other stuff is usually located here as well... -->
    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />               
        </customHeaders>
    </httpProtocol>
<system.webServer>

或者,在 Global.asax.cs 中

public class WebApiApplication : System.Web.HttpApplication

    protected void Application_Start()
    
        /* Some register config stuff is already located here */
    

    // Add this method:
    protected void Application_BeginRequest()
    
        HttpContext.Current.Response.AddHeader
            (name: "Access-Control-Allow-Origin", value: "*");            
    

【讨论】:

我想知道答案是否被接受,而没有考虑在允许来源标头中使用 * 的安全含义。读者,请研究在此标头中使用什么值。 我并不是要在这个答案中给读者一个关于安全性的讲座,因为它回答了一个关于 CORS 的入门级问题。虽然我不同意你的观点,但我认为安全性以及Access-Control-Allow-Credentials 是学习曲线进一步下降的东西。不过,如果需要,我可以在安全性方面添加脚注来扩展这个答案。 是的。脚注会有所帮助。谢谢。 我对此有点困惑。如果我使用curl 发出请求并自己设置Origin 标头怎么办?然后,不会有任何浏览器可以阻止这种情况。在那种情况下会发生什么? curl(和 Postman,就此而言)不关心 CORS,只会忽略 Access-Control-Allow-Origin 标头。它纯粹是所有主流浏览器实现的一种机制,以帮助安全浏览。【参考方案2】:

正如 Baksteen 所说,您不能在 javascript 中更改此标头值。您必须编辑服务器配置以允许跨源请求。

但是:在阅读了您的 cmets 之后,我认为您需要一个仅用于调试和测试的解决方案。

在这种情况下,您可以使用 Chrome 并使用特殊的不安全参数启动它。如果您将此参数提供给 Chrome,它将允许您跨域请求。

不要将此 chrome 实例用于测试页面以外的其他用途!

chrome --disable-web-security --user-data-dir

我为 Firefox 和 Chrome 尝试了几个附加组件,但它们不适用于最新版本的浏览器。所以我建议切换到 chrome 并使用上面的参数来测试你的 API 调用。


如果您对更强大的解决方案感兴趣,您可能想要使用调试代理,例如Fiddler from Telerik。您可以编写自定义规则,以便 Fiddler 在请求离开您的 PC 之前更改您的标头。但是您必须先深入研究该工具,然后才能使用它的所有功能。这可能很有趣,因为它可以帮助您解决的不仅仅是这个调试问题。

【讨论】:

以上是关于如何设置 Origin 请求标头的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Framework 4.2/Boot 1.3 中根据 Origin HTTP 请求标头设置动态 Access-Control-Allow-Origin?

如何使 AWS ALB 将请求源发送到 lambda

尽管 Access-Control-Allow-Origin 设置为 express ,但请求标头字段 Authorization

如何调试“请求的资源上不存在‘Access-Control-Allow-Origin’标头”

如何调试请求的资源上不存在“Access-Control-Allow-Origin”标头

如何解决“请求的资源上不存在‘Access-Control-Allow-Origin’标头”