如何在htaccess中排除特定URL以避免PayPal脚本被CSP拦截
解决CSP规则排除特定URL的配置方案
关于Files/FilesMatch在<IfModule>内的可用性
可以在<IfModule>内部使用Files或FilesMatch指令,但它们仅匹配文件系统中的文件名,而非请求的URL路径,这就是你之前用负向前瞻正则匹配/order、/paypal开头URL失败的核心原因——这类指令不处理URL路径逻辑。
正确的配置方法
根据Apache版本,提供两种可靠方案:
方案1:Apache 2.4+ 用<If>指令(推荐)
利用<If>指令的路径匹配逻辑,仅对非/order和/paypal开头的URL设置CSP:
<IfModule mod_headers.c> # 仅当请求路径不以/order或/paypal开头时,设置CSP <If "%{REQUEST_URI} !~ m#^/(order|paypal)#"> Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src 'self' *.youtube.com; img-src * data:; media-src * data:; report-uri /logging" </If> </IfModule>
- 正则
^/(order|paypal)精准匹配以/order或/paypal开头的URL路径 !~表示“不匹配”该正则条件
方案2:兼容Apache 2.2的SetEnvIf+Header条件设置
如果服务器是Apache 2.2(不支持<If>指令),可通过环境变量做判断:
<IfModule mod_headers.c> # 给/order和/paypal开头的URL标记环境变量 SetEnvIf Request_URI "^/(order|paypal)" SKIP_CSP=1 # 仅当SKIP_CSP环境变量不存在时,设置CSP Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src 'self' *.youtube.com; img-src * data:; media-src * data:; report-uri /logging" env=!SKIP_CSP </IfModule>
SetEnvIf根据请求URI设置环境变量SKIP_CSPenv=!SKIP_CSP表示仅当该环境变量不存在时,才发送CSP头
内容的提问来源于stack exchange,提问作者Avatar
相关产品推荐
相关产品推荐

