如何仅在重定向时添加自定义标头

如何仅在重定向时添加自定义标头

当出现 HTTP 重定向相关代码(30x)时,我想更改缓存控制标头。

我如何检查响应的 HTTP 代码来确定是否应该运行add_header

答案1

下列的应该管用:

server {
    listen 60729;
    error_page 301 @301;
    return 301 http://example.su/test;
    location @301 {
        add_header X-Header value;
        return 301 $sent_http_location;
    }
}

确认信息如下:

%curl -v localhost:60729 | & fgrep \
    -e HTTP/ -e X-Header -e Location -e title | sed 's#^#\t#g'
> GET / HTTP/1.1
< HTTP/1.1 301 Moved Permanently
< Location: http://example.su/test
< X-Header: value
<head><title>301 Moved Permanently</title></head>

请注意,配置的每个部分都非常重要:

  • error_page指令有效地为 nginx 提供了非常简洁的异常处理功能;

  • 如果没有return 301location @301nginx 将尝试从文件系统提供所需的文件;这可能会导致404,因此,您将获得一个404页面;请注意,Location标题仍将保留,但X-Header将会丢失404 Not Found页面,因为根据文档add_header指令,它不允许你向错误页面添加标题;

  • 使用平原return 301;内的location @301,你将有效地清除Location,所以,你的Location将是空的;因此你必须使用$sent_http_保存当前值。

如果你想尝试上述的 POC MVP,你可以在以下位置找到完整配置我的 GitHubhttps://github.com/cnst/StackOverflow.cnst.nginx.conf

答案2

如果您在 nginx 中执行重定向,这应该可以工作。您必须使用 headers_more 模块构建 Nginx,这非常简单 - 请参阅我的Nginx 教程在这里

 location /match/ {
   add_header HEADER_NAME "header value";
   return 301 https://example.com;
 }

如果您要代理返回重定向的应用程序,那么它会稍微复杂一些,可能涉及 IF 语句。nginx 中的 IF 并不总是按预期工作,因此在这种情况下,您最好更改应用程序。

相关内容