Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Конфигурация nginx для sitemap.xml чтобы не добавлялся закрывающий слэш

Андрей Власенко Ученик (176), на голосовании 8 месяцев назад
Итак есть настроенный nginx

  
location / {
try_files $uri $uri/ /index.php$is_args$args;
location ~ [^/]\.ph(p\d*|tml)$ {
#return 200 'loca 2';
try_files /does_not_exists @php;
}
}


location @php {
fastcgi_index index.php;
fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f info@xxx-xxx.ru";
fastcgi_pass unix:/var/www/php-fpm/1.sock;
fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
try_files $uri =404;
include fastcgi_params;
}
Он добавляет закрывающий слэш ко всему кроме найденных файлов физически, остальное переадресует на index.php. Я так понимаю за это отвечает данный кусок:

 try_files $uri $uri/ /index.php$is_args$args; 

и при попытке обратиться к /sitemap.xml, который генерируется скриптом php никсы не находят этого файла и добавляют /sitemap.xml/

Попытка дописать location и так:
  	location ^/sitemap.xml$ { 
try_files /does_not_exists @php;
}
И так:

  	location  = sitemap.xml { 
try_files /does_not_exists @php;
}
Не помогает. Подскажите где ошибаюсь и как правильно?
Голосование за лучший ответ
Pomogay Мудрец (15527) 9 месяцев назад
Ваша текущая конфигурация Nginx пытается найти файл `sitemap.xml` как физический файл в файловой системе, и когда не находит, перенаправляет запрос на `index.php`, добавляя закрывающий слэш.

Проблема в том, что когда вы указываете `try_files $uri $uri/ /index.php$is_args$args;`, Nginx сначала проверяет наличие физического файла по пути `$uri`, затем ищет директорию `$uri/`, и, если ни то, ни другое не найдено, перенаправляет запрос на `index.php`.

Чтобы обрабатывать `sitemap.xml` через PHP, необходимо правильно настроить блок `location`. В вашем случае можно использовать прямое сравнение для `sitemap.xml`, чтобы обработать его через PHP, не добавляя слэша. Пример правильной конфигурации:

```nginx
location = /sitemap.xml {
try_files $uri @php;
}

location / {
try_files $uri $uri/ /index.php$is_args$args;
location ~ [^/]\.ph(p\d*|tml)$ {
try_files /does_not_exists @php;
}
}

location @php {
fastcgi_index index.php;
fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f info@xxx-xxx.domen";
fastcgi_pass unix:/var/www/php-fpm/1.sock;
fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
try_files $uri =404;
include fastcgi_params;
}
```

В этой конфигурации, когда запрос идет на `/sitemap.xml`, Nginx проверяет, существует ли этот файл (что не должно быть, так как он генерируется PHP), и если нет, передает запрос на `@php`. Это должно позволить обрабатывать `sitemap.xml` через PHP без добавления закрывающего слэша.
Андрей ВласенкоУченик (176) 9 месяцев назад
По неведомой мне причине слэшь всё-равно добавился, я сделал в первую строку index.php своего фреймворка
вывод И слэш уже добавленИмеющиеся ещё правила в файле
  
# Убираем знак вопроса в конце URL (/?)
if ($request_uri ~ "^(.*)\?$") {
return 301 $1;
}

if ($host = xxxkmv.ru) {
rewrite ^/$ https://xxxx-kmv.ru/ permanent;
rewrite ^/(.*)/$ https://xxxx-kmv.ru/$1/ permanent;
}


# fixes
if ($host ~* ^www\.(.*)$) {
return 301 https://xxx-kmv.ru$request_uri;
}
if ($request_uri = "/dir/") {
return 301 https://xxx-kmv.ru;
}
if ($request_uri = "/index.html/") {
return 301 https://xxx-kmv.ru;
}
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (264619) 9 месяцев назад
Можно пробовать с директивой if

 location / { 
if ($request_uri ~ ^/(sitemap\.xml)/?$) {
rewrite ^ /index.php$is_args$args last;
}

try_files $uri $uri/ /index.php$is_args$args;

location ~ [^/]\.ph(p\d*|tml)$ {
try_files /does_not_exist @php;
}
}

location @php {
fastcgi_index index.php;
fastcgi_param PHP_ADMIN_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f info@xxx-xxx.ru";
fastcgi_pass unix:/var/www/php-fpm/1.sock;
fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
try_files $uri =404;
include fastcgi_params;
}
Андрей ВласенкоУченик (176) 9 месяцев назад
Ваш вариант, к сожалению, тоже не сработал. В ответе выше прокомментировал как повела система себя
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (264619) пробовать надо так: location = /sitemap.xml { rewrite ^ /index.php$is_args$args last; } или так location = /sitemap.xml { try_files /index.php$is_args$args =404; }
Андрей ВласенкоУченик (176) 9 месяцев назад
  
location = /sitemap.xml {
rewrite ^ /index.php$is_args$args last;
}
Ура! Сработало! Причём ещё проблема была в кэшировании (видимо редиректов) со стороны хрома , надо в режиме инкогнито тестить.
Спасибо вам огромное! Пусть у Вас всё ладится!
Похожие вопросы