我正在尝试为所有子域,端口和协议启用CORS。

例如,我希望能够从http://sub.mywebsite.example:8080/到https://www.mywebsite.example/*运行XHR请求

通常情况下,我想启用来自源匹配的请求(并且仅限于):

/ / * .mywebsite.example: * / *


当前回答

当从“cookie域”(www.domain.example)读取字体时,我们在静态的“无cookie”域上也遇到了类似的问题,这篇文章是我们的英雄。看这里:我如何修复“丢失跨源资源共享(CORS)响应头”webfont问题?

对于复制/粘贴-r类型(并给一些道具),我从所有的贡献中拼凑起来,并将其添加到站点根目录的。htaccess文件的顶部:

<IfModule mod_headers.c>
 <IfModule mod_rewrite.c>
    SetEnvIf Origin "http(s)?://(.+\.)?(othersite\.example|mywebsite\.example)(:\d{1,5})?$" CORS=$0
    Header set Access-Control-Allow-Origin "%{CORS}e" env=CORS
    Header merge  Vary "Origin"
 </IfModule>
</IfModule>

超级安全,超级优雅。喜欢它:你不必开放你的服务器带宽给资源小偷/热链接者类型。

其他回答

对我来说,我想要一个多域选项,这就是我使用的解决方案,使用python和flask,

    VALID_DOMAINS = 'https://subdomain1.example.com', 'https://subdomain2.example.com'


    def handle_request(request):
        origin = request.headers.get('Origin')
    
        if request.method == 'OPTIONS':
            if origin not in :
                return ''
    
            headers = {
                'Access-Control-Allow-Origin': origin,
                'Access-Control-Allow-Methods': 'GET',
                'Access-Control-Allow-Headers': 'Content-Type',
                'Access-Control-Max-Age': '3600',
            }
            return '', 204, headers
    
        return (
            main_function_with_logic(request),
            200,
            {'Access-Control-Allow-Origin': origin,
             ...}
        )

显然,您可以将VALID_DOMAINS扩展到任意您想要的长度,以及任何您想要的(非https、不同端口等),并在请求上进行检查。

与通配符解决方案相比,我更喜欢这种解决方案,因此这是我在运行的服务器上的选择。

根据daverrandom的回答,我也在玩,找到了一个稍微简单一点的Apache解决方案,它产生了相同的结果(Access-Control-Allow-Origin被动态地设置为当前特定的协议+域+端口),而不使用任何重写规则:

SetEnvIf Origin ^(https?://.+\.mywebsite\.example(?::\d{1,5})?)$   CORS_ALLOW_ORIGIN=$1
Header append Access-Control-Allow-Origin  %{CORS_ALLOW_ORIGIN}e   env=CORS_ALLOW_ORIGIN
Header merge  Vary "Origin"

就是这样。

那些想要在父域(例如mywebsite.example)以及所有子域上启用CORS的人可以简单地将第一行中的正则表达式替换为:

^ (https ?://(?:.+\.)? mywebsite \ .example (?:: \ d{1, 5}) ?)美元。

注意:为了符合规范和正确的缓存行为,ALWAYS为启用cors的资源添加Vary: Origin响应头,即使对于非cors请求和来自不允许的源的请求也是如此(参见示例原因)。

我在回答这个问题,因为公认的答案做不到跟随

正则表达式分组会影响性能,但这是不必要的。 不能匹配主域,只适用于子域。

例如:它不会为http://mywebsite.example发送CORS头,而为http://somedomain.mywebsite.example/工作

SetEnvIf Origin "http(s)?://(.+\.)?mywebsite\.com(:\d{1,5})?$" CORS=$0

Header set Access-Control-Allow-Origin "%{CORS}e" env=CORS
Header merge  Vary "Origin"

要启用你的网站,你只是把你的网站在mywebsite的地方。在上面的Apache配置的例子。

允许多个站点:

SetEnvIf Origin "http(s)?://(.+\.)?(othersite\.com|mywebsite\.example)(:\d{1,5})?$" CORS=$0

部署后验证:

下面的curl响应在更改后应该具有“Access-Control-Allow-Origin”标头。

curl -X GET -H "Origin: http://site1.example" --verbose http://site2.example/query

当在.htaccess中设置Access-Control-Allow-Origin时,只有以下几种有效:

SetEnvIf Origin "http(s)?://(.+\.)?domain\.example(:\d{1,5})?$" CRS=$0
Header always set Access-Control-Allow-Origin "%{CRS}e" env=CRS

我尝试了其他几个建议的关键字头追加,头集,没有工作建议在Stack Overflow上的许多答案,虽然我不知道这些关键字是否过时或对nginx无效。

以下是我的完整解决方案:

SetEnvIf Origin "http(s)?://(.+\.)?domain\.example(:\d{1,5})?$" CRS=$0
Header always set Access-Control-Allow-Origin "%{CRS}e" env=CRS
Header merge Vary "Origin"

Header always set Access-Control-Allow-Methods "GET, POST"
Header always set Access-Control-Allow-Headers: *

# Cached for a day
Header always set Access-Control-Max-Age: 86400

RewriteEngine On

# Respond with 200OK for OPTIONS
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

当从“cookie域”(www.domain.example)读取字体时,我们在静态的“无cookie”域上也遇到了类似的问题,这篇文章是我们的英雄。看这里:我如何修复“丢失跨源资源共享(CORS)响应头”webfont问题?

对于复制/粘贴-r类型(并给一些道具),我从所有的贡献中拼凑起来,并将其添加到站点根目录的。htaccess文件的顶部:

<IfModule mod_headers.c>
 <IfModule mod_rewrite.c>
    SetEnvIf Origin "http(s)?://(.+\.)?(othersite\.example|mywebsite\.example)(:\d{1,5})?$" CORS=$0
    Header set Access-Control-Allow-Origin "%{CORS}e" env=CORS
    Header merge  Vary "Origin"
 </IfModule>
</IfModule>

超级安全,超级优雅。喜欢它:你不必开放你的服务器带宽给资源小偷/热链接者类型。