Как заставить Nginx переопределить заголовок?
Я пытаюсь отобразить свои карты сайта. Браузеры отображают индекс моего файла Sitemap в формате XML, но обрабатывают файлы Sitemap для записей как простой текст.
Я попытался переопределить тип контента с помощью приведенной ниже конфигурации, но это не помогло.
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>
и один из постов Sitemaps
<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>
.....
Я использую конфигурацию laravel nginx по умолчанию
1 ответ
Вы не можете на самом деле установить Content-Type
заголовок для содержимого proxy_passed с использованием простого nginx. Вам нужно скомпилировать его с помощью https://github.com/openresty/headers-more-nginx-module для этой функциональности. После того, как вы получили этот модуль, установить заголовки так же просто, как:
location ~ \.xml$ {
... your config ...
more_set_headers "Content-Type: application/xml";
... proxy_pass settings ...
}
В качестве альтернативы, если эти ваши файлы карты сайта фактически не создаются внутренним сервером на лету, и они фактически существуют в папке вашего сайта, вам не нужно использовать proxy_pass
, Попробуйте использовать их напрямую с помощью nginx:
location ~ \.xml$ {
try_files $uri =404;
}
Если вы не знаете, как скомпилировать nginx с внешним модулем в Ubuntu 18, просто выполните следующие простые шаги:
Станьте суперпользователем с этой командой, чтобы мы могли пропустить ввод
sudo
каждый раз:sudo su
Установите необходимые компоненты для сборки nginx с помощью следующей команды:
apt install -y build-essential git tree libpcre3-dev libssl-dev zlib1g-dev libxslt1-dev libgd-dev libgeoip-dev
Загрузите последний исходный код nginx с http://nginx.org/en/download.html
wget http://nginx.org/download/nginx-1.15.8.tar.gz
Распакуйте его и войдите в каталог дерева исходных текстов
tar xzfv nginx-1.15.8.tar.gz && cd nginx-1.15.8
Получить
headers-more-nginx-module
:git clone https://github.com/openresty/headers-more-nginx-module
Получите аргументы конфигурации вашего установленного 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
make && make install
Теперь у вас есть
headers-more-nginx-module
в вашей системе и полная поддержка этих директив конфигурации, я упоминал ранее.