如何在 PHP 中覆盖 Nginx 响应标头

如何在 PHP 中覆盖 Nginx 响应标头

我想在 nginx 中应用默认的 CSP 标头 - 基本上是一个万能的。但是,我还希望能够在某些脚本中通过 PHP 覆盖 CSP 标头。到目前为止,我还没有找到一种方法来做到这一点,结果是我得到了 2 个标头 - 第一个来自 PHP,第二个来自 Nginx,最后一个标头优先于第一个。

在 nginx 中我有:

add_header Content-Security-Policy "default-src 'self';";

然后是 PHP 文件的一个问题:

location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param HTTP_PROXY "";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_intercept_errors on;
        fastcgi_connect_timeout         300; 
        fastcgi_send_timeout           3600; 
        fastcgi_read_timeout           3600;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }

我尝试过fastcgi_param看看是否可以从 PHP 中取回标头,并且仅 add_header (如果未设置),以及尝试:

    if ($http_content_security_policy = "") {
        add_header Content-Security-Policy "default-src 'self';";
    }

但到目前为止还没有成功。我猜想这是 Nginx 中 PHP 标头值的时间或访问问题?任何帮助都非常感谢。

注意:我正在使用 Azure Web 应用程序,因此我认为我无法添加任何非 Nginx 默认模块

答案1

add_header如果提供的值是空字符串,该指令将不会生成标题。

您可以add_header使用map块为语句提供各种值。请参阅map指令性文件

PHP 脚本返回的标头可用作$upstream_http_content_security_policy

因此解决方案是使用块测试 PHP 脚本返回的值map,并且仅当脚本没有返回标头时才设置默认值。

例如:

map $upstream_http_content_security_policy $csp_value {
    ""  "default-src 'self';";
}
add_header Content-Security-Policy $csp_value;

$upstream_http_content_security_policy仅当变量为空(意味着脚本未提供替代值)时才会插入 Content-Security-Policy 的默认标头。

注意,map块必须放在server块之外。add_header语句可以保留在当前定义它的位置。

相关内容