Apache中能否仅针对指定Origin设置Access-Control-Allow-*相关HTTP头部?
如何在Apache中仅针对特定Origin设置CORS头部
当然可以实现这个需求!你可以借助Apache的SetEnvIf指令和条件式Header配置,让CORS头部只在请求的Origin符合你指定的规则时才生效。下面是修改后的完整配置,我会一步步解释:
<VirtualHost *:80> DocumentRoot /var/www/html/ RewriteEngine On # 处理OPTIONS预检请求 RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L] # 匹配你允许的Origin(这里以http://example.com和http://another-example.com为例) SetEnvIf Origin "^http(s)?://(www\.)?example\.com$" ALLOWED_ORIGIN=$0 SetEnvIf Origin "^http(s)?://(www\.)?another-example\.com$" ALLOWED_ORIGIN=$0 # 仅当ALLOWED_ORIGIN环境变量存在时,设置CORS头部 Header always set Access-Control-Allow-Origin "%{ALLOWED_ORIGIN}e" env=ALLOWED_ORIGIN Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" env=ALLOWED_ORIGIN Header always set Access-Control-Allow-Headers "Content-Type" env=ALLOWED_ORIGIN </VirtualHost>
关键部分解释:
SetEnvIf指令:它会检查请求的Origin头是否匹配你定义的正则表达式,如果匹配,就创建一个名为ALLOWED_ORIGIN的环境变量,值为匹配到的Origin地址。你可以根据需要添加更多SetEnvIf行来支持多个允许的Origin。- 条件式
Header指令:通过env=ALLOWED_ORIGIN这个条件,只有当ALLOWED_ORIGIN环境变量存在时(也就是请求Origin符合规则),才会设置对应的CORS响应头。 - OPTIONS请求处理:保留了你原来的Rewrite规则,确保预检请求能得到200响应,这部分对CORS来说是必需的。
如果你的需求是允许所有子域名,比如*.example.com,可以把正则表达式改成^http(s)?://.*\.example\.com$,这样所有example.com的子域名都会被匹配到。
内容的提问来源于stack exchange,提问作者zaqxsw
相关产品推荐
相关产品推荐

