Переадресация Nginx 404 для структуры под-URL yii

Я пытаюсь перенаправить 404 страницы на мой основной сайт со следующим конфигом в nginx:

server {

listen   80;

server_name localhost;
root /var/www/mysite;

include /etc/nginx/rewrite/*.conf;

fastcgi_intercept_errors on;

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

location ~ ^/(news|items)/? {
error_page      404     =301 @redirect;
}

location @redirect {
rewrite .* / permanent;
}

location ~ \.php$ {
fastcgi_pass   unix:/tmp/php5-fpm.socket;
fastcgi_index  index.php;
include fastcgi_params;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
fastcgi_param  PATH_INFO        $fastcgi_path_info;
}

}

Как и в этом конфиге, все 404 страницы перенаправляются на / site.

Как я могу дополнительно настроить этот конфиг так, чтобы я просто перенаправил ТОЛЬКО 404, который происходит на под-URL и их нижнюю строку с 301 (например, / news // и / предметы /*) а остальные 404 держать нетронутыми?

Для иллюстрации далее:
Перенаправить 404 для следующего с 301:

/news/
/items/

Оставить 404 для отдыха, например:

/
/posts
/images
/videos

ОБНОВЛЕНИЕ: я изменил конфигурацию, основанную на рекомендации Мелвина. Теперь он перенаправляет все запросы, начинающиеся с / news и / items, независимо от того, 404 или нет. Я использую Yii PHP Framework. Для упомянутых выше папок нет физического расположения, это всего лишь маршрут для Yii.

ОБНОВЛЕНИЕ 2: нашел решение. Проверьте мой ответ ниже.

0

Решение

В настоящее время вы устанавливаете страницу ошибок на уровне сервера, но error_page также работает в определенном месте.

Таким образом, для любого местоположения, которое вы хотите переопределить поведение по умолчанию, просто добавьте местоположение и добавьте страницу error_page.

Не бойтесь повторяться, nginx предпочтительнее сложных регулярных выражений.

В вашем случае вы хотите, чтобы поведение по умолчанию было другим, поэтому просто удалите страницу error_page с уровня сервера и установите ее только на / news / и / items /.

Наконец, поскольку назначение является статическим, вы можете просто использовать:

error_page 404 =301 $scheme://$host/;
0

Другие решения

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

Я добавил оператор ‘if’, который проверяет переменную $ request_uri для тех, которые я хочу иметь пользовательские 404

location ~ \.php$ {
fastcgi_pass   unix:/tmp/php5-fpm.socket;
fastcgi_index  index.php;
include fastcgi_params;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
fastcgi_param  PATH_INFO        $fastcgi_path_info;
if ($request_uri ~ ^/(news|items) {
error_page      404     =301 @redirect;
}
}

Конечно, следующий блок был удален

location ~ ^/(news|items)/? {
error_page      404     =301 @redirect;
}

Таким образом, я могу перенаправить все 404 в / news / и / items /, в то время как остальные обрабатываются обработчиком ошибок PHP по умолчанию.

0

По вопросам рекламы [email protected]