Задать вопрос
@Kostushko

Nginx как сделать перенаправление для определенных uri, возвращающих 404?

Для cms (joomla), работающей на nginx+php-fpm, нужно сделать редирект для страниц пагинации, возвращающих 404.
Например в категории auto есть 4 страницы пагинации:
/auto.html
/auto/page-2.html
/auto/page-3.html
/auto/page-4.html
Нужно чтобы остальные, не существующие страницы этой категории (/auto/page-5.html ... /auto/page-999.html) возвращали 301 редирект на первую страницу категории (/auto.html).
Категорий много, сайт наполняется, поэтому когда движок сайта со страницы /auto/page-5.html начнет выдавать не 404, а 200 редирект в nginx должен перестать работать.

Код, который, вроде, должен работать, редиректит (на /auto.html) и существующие страницы (/auto/page-2.html ... /auto/page-4.html) и не существующие (/auto/page-5.html.../auto/page-999.html).

location ~* /(auto)/page-\d+\.html {
    error_page 404 = @page;
  }
  
  location @page {
    rewrite /(.*?)/page-\d+\.html http://site.ru/$1.html permanent;
  }

  error_page 404 =404       /404.html;
  location ~* \.php$          {
    include                   fastcgi_def;
  }
  location /                  {try_files $uri /index.php?$args;}
  • Вопрос задан
  • 5951 просмотр
Подписаться 1 Оценить 8 комментариев
Решения вопроса 1
@Kostushko Автор вопроса
Заработало как надо в такой конфигурации:

error_page 404 =404         /404.html;
  location ~* \.php$          {
    include                   fastcgi_def;
    include                   add/cachephp;
    if ($request_uri ~ /(.+)/page-\d+\.html) {
      error_page 404 = @page;
    }
    fastcgi_intercept_errors on;
  }
  location /                  {try_files $uri /index.php?$args;}
  
  location @page {
    if ($request_uri ~ /(.+)/page-\d+\.html) {return 301 /$1.html;}
    return 410;
  }


Спасибо Алексей Тен, за наводку. Предыдущая конфигурация
location @page {
    rewrite /(.+)/page-\d+\.html /$1.html redirect;
    return 404;
}

Не работала, т.к. в @page попадает уже преобразованный запрос, который отправлялся на index.php, чтобы сформировать редирект надо использовать исходный запрос.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Lynn
@Lynn
nginx, js, css
Можно попробовать так:
error_page 404 /404.html;

location / {
    try_files $uri /index.php;
}

location ~* \.php$ {
    include fastcgi_def;
    fastcgi_intercept_errors on;
    error_page 404 = @page;
}

location @page {
    rewrite /(.+)/page-\d+\.html /$1.html redirect;
    return 404;
}
Ответ написан
Комментировать
@polozad
location /auto {
try_files $uri /auto.html; 
root /bla/bla/auto
}

try_files - проверяет наличие файлов по указанному пути, если их не будет, использует последний аргумент в директиве с внутренним редиректом.

nginx.org/ru/docs/http/ngx_http_core_module.html#t...

Можно нагородить забор с именованным локейшеном типа @fallback, но это излишне, я считаю.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы