如何强制 Nginx 覆盖标头?

如何强制 Nginx 覆盖标头?

我正在尝试显示我的站点地图。浏览器将我的站点地图索引显示为 xml,但将帖子站点地图视为纯文本。

我尝试用以下配置覆盖内容类型,但没有帮助。

location ~ \.xml$ {
    proxy_hide_header Content-Type;
    add_header Content-Type "application/xml";
}

如何强制 nginx 将内容类型设置为“application/xml”?

顺便说一下,站点地图简而言之......

网站地图索引

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <sitemap>
        <loc>http://www.example.com/sitemaps/sitemap-1.xml</loc>

        <lastmod>2019-02-10T12:22:18+00:00</lastmod>
    </sitemap>
    ....
</sitemapindex>

以及其中一篇帖子的站点地图

<loc>http://www.example.com/en</loc>
    <xhtml:link rel="alternate" hreflang="en" href="http://example.com/en" />
    <xhtml:link rel="alternate" hreflang="fr" href="http://example.com/fr" />
    <lastmod>2019-02-10T00:00:00+00:00</lastmod>
    <changefreq>daily</changefreq>
    <priority>1</priority>
</url>
<url>
.....

我使用默认的 laravelnginx 配置

答案1

实际上,您无法Content-Type使用普通的 nginx 设置 proxy_passed 内容的标头。您需要使用以下方法进行编译:标头-更多-nginx-模块获得该功能。获得该模块后,设置标题非常简单:

location ~ \.xml$ {
    ... your config ...
    more_set_headers "Content-Type: application/xml";
    ... proxy_pass settings ...
}

或者,如果你的站点地图文件实际上不是由后端服务器动态生成的,而是实际上存在于你的网站文件夹中,那么你实际上并不需要使用proxy_pass。尝试直接通过 nginx 为它们提供服务:

location ~ \.xml$ {
    try_files $uri =404;
}

如果你不知道如何在 Ubuntu 18 上使用外部模块编译 nginx,只需按照以下简单步骤操作:

  1. 使用此命令成为超级用户,这样我们就可以跳过sudo每次输入:

    sudo su

  2. 使用以下命令安装构建 nginx 的先决条件:

    apt install -y build-essential git tree libpcre3-dev libssl-dev zlib1g-dev libxslt1-dev libgd-dev libgeoip-dev

  3. 从以下网址下载最新的 nginx 源代码http://nginx.org/en/download.html

    wget http://nginx.org/download/nginx-1.15.8.tar.gz

  4. 解压并进入源码树目录

    tar xzfv nginx-1.15.8.tar.gz && cd nginx-1.15.8

  5. 获取headers-more-nginx-module

    git clone https://github.com/openresty/headers-more-nginx-module

  6. 获取已安装的 nginx 的配置参数(通过运行nginx -V),--add-module=/path/to/headers-more-nginx-module向其中添加选项或仅使用以下命令进行配置:

    ./configure --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --user=www-data --group=www-data --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --sbin-path=/usr/sbin/nginx --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-module=./headers-more-nginx-module

  7. make && make install

  8. 现在headers-more-nginx-module您的系统已经完全支持我之前提到的那些配置指令。

相关内容