当前位置: 首页 > 知识库问答 >
问题:

如何启用CORS的Apache web服务器(包括飞行前和自定义头)?

安承教
2023-03-14

概述:

Request URL:x/site.php
Request Method:OPTIONS
Status Code:302 Found
Remote Address:x.x.x.x:80

响应标题:

view source
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Origin:*
Access-Control-Max-Age:300
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Length:0
Content-Type:text/html; charset=UTF-8
Date:Thu, 02 Mar 2017 14:27:21 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Location:y
Pragma:no-cache
Server:Apache/2.4.25 (Ubuntu)

请求报头:

view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:authorization
Access-Control-Request-Method:POST
Cache-Control:no-cache
Connection:keep-alive
DNT:1
Host:x
Origin:http://127.0.0.1:3000
Pragma:no-cache
Referer:http://127.0.0.1:3000/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36

Apache虚拟主机配置看起来是这样的:

    <IfModule mod_headers.c>
           Header set Access-Control-Allow-Origin "http://127.0.0.1:3000"
           Header set Access-Control-Allow-Origin "http://127.0.0.1"
           Header set Access-Control-Max-Age "300"
           Header set Access-Control-Allow-Credentials "true"
           Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept"
           Header set Access-Control-Allow-Methods "POST, GET, PUT, DELETE, PATCH, OPTIONS"
    </IfModule>

飞行前请求跳过apache配置并直接命中我的webapp,这将执行重定向(因此是302,位置为:y)。

我不知道为什么阿帕奇没有处理飞行前的请求?

共有1个答案

马泰
2023-03-14

要完全启用CORS Apache Web服务器,您需要将其配置为如下所示:

Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Headers "Authorization"
Header always set Access-Control-Allow-Methods "GET"
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
Header always set Access-Control-Max-Age "600"

RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

详细解释见https://benjaminhorn.io/code/setting-cors-cross-origin-resource-sharing-on-apache-with-correct-response-headers-allowing-everything-through/

关于为各种访问控制-响应头设置哪些值的一些一般说明:

>

  • 访问-控制-允许-标头:您必须将其设置为包括您的请求发送的任何标头名称,除了CORS安全列表标头名称或所谓的“禁止”标头名称(浏览器设置的标头名称,您不能设置在你的JavaScript中);该规范还允许*通配符作为其值——所以你可以尝试一下,尽管有些浏览器可能还不支持它:Chromebug、火狐bug、Safaribug。

    Access-Control-允许-方法:规范还允许通配符-但是,与Access-Control-允许-Headers:*一样,一些浏览器可能还不支持它。

    访问-控制-暴露-报头:设置为包括超出过期缓存-控制内容类型Pragma最后修改内容语言的任何响应报头您的前端代码需要读取。许多人忘记设置这个,最终困惑于为什么他们不能读取特定响应头的值)。同样,规范也允许这里的*通配符,但是一些浏览器可能还不支持它。

    Access Control Max Age:Chrome的硬编码上限为600(10分钟),因此没有必要为其设置更高的值(如果将其设置得更高,Chrome只会将其限制为10分钟,Safari将其限制为仅5分钟)。

    因此,就问题所述的特定要求,需要作出的具体修改和补充如下:

    >

  • 使用Header总是set而不仅仅是Header set

    使用mod_rewrite处理选项,只需将200 OK与这些标题一起发送回即可。

    请求具有访问控制请求头:授权,因此在Apache配置中,在访问控制允许头响应头中添加授权

    Origin是浏览器设置的“禁止”标题名,Accept是CORS安全列出的标题名,因此无需将其包含在访问控制允许标题中。

    请求不发送内容类型,因此响应中不需要访问控制允许标头(并且获取请求从不需要该类型,否则仅当类型不是应用程序/x-www-form-urlcoded文本/普通多部分/表单数据时才需要该类型)。

    对于访问控制允许方法,请求似乎只是一个GET,所以除非计划也使DELETE PATCH请求没有指向包括他们。

  •  类似资料:
    • 所以这里的是一个类似JWT的标记。 在我的Angular代码中,我只需将令牌添加为,如下所示: 请注意,我的身份验证/注册路由工作正常,我只是在将标头传输到Spring服务器时遇到了困难。 谢谢,

    • 问题内容: 作为我的标题,这是位于conf.d / api-server.conf中的配置文件 nginx.conf文件与默认设置相同。 将请求发送到api.localhost(api.localhost / admin / login)之后,我仍然收到405错误: 问题答案: 问题是您的if条件不会在中发送父项中的标头。如果您检查飞行前响应标头,它将是 那什么也没给。因此,有两种可能的解决方案。

    • 我看到了Apache NiFi的这个示例(https://medium.com/hashmapinc/creating-custom-processors-and-controllers-in-apache-nifi-e14148740ea),但仍然无法理解如何为自定义处理器和控制器服务实现打包结构。 我的目标是创建一个自定义控制器服务来使用我的多个自定义处理器。我的maven结构应该是什么样子?

    • Appium 的 iOS 版本的后端用的是Facebook's WebDriverAgent。该后端是基于苹果公司的 XCTest 框架,所以也有所有XCTest 框架已知的问题。其中有些问题我们正在设法解决,有一些在现阶段可能无法解决。本文中描述的方法已经能够使您完全掌握在设备上如何构建、管理和运行WDA。通过这种方式,您可以在CI环境中对您的自动化测试进行微调,并使其在长期运行的情况下更加稳定

    • 问题内容: 我试图启动我的自定义TextSecure(信号)服务器。我想将其用于Signal拥有的所有功能(SMS和电话)。我相信我也需要Redphone服务器来运行电话。我发现只有TextSecure服务器的github 仓库是https://github.com/WhisperSystems/TextSecure- Server, 但是没有Redphone服务器的仓库。 我认为我还需要运行此服

    • 问题内容: 我有两个位于不同服务器上的PHP文件,一个位于,另一个位于。 我想包括第一个文件中的第二个文件。 第二个文件的内容如下所示: 和第一个文件: 有什么办法可以做到吗? 问题答案: 否,此设置在大多数Web服务器(php.ini)中默认为禁用/不允许,因此出于 安全原因 ,您不能使用来包含来自远程地址的文件。 如果仍然要允许 包含 远程文件,则必须在php.ini中将该指令设置为 但是,从