Я пытаюсь перенаправить 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: нашел решение. Проверьте мой ответ ниже.
В настоящее время вы устанавливаете страницу ошибок на уровне сервера, но error_page также работает в определенном месте.
Таким образом, для любого местоположения, которое вы хотите переопределить поведение по умолчанию, просто добавьте местоположение и добавьте страницу error_page.
Не бойтесь повторяться, nginx предпочтительнее сложных регулярных выражений.
В вашем случае вы хотите, чтобы поведение по умолчанию было другим, поэтому просто удалите страницу error_page с уровня сервера и установите ее только на / news / и / items /.
Наконец, поскольку назначение является статическим, вы можете просто использовать:
error_page 404 =301 $scheme://$host/;
Нашел обходной путь для этого. Не уверен, что это хорошая практика или нет, но, безусловно, стоит попробовать, если вы используете 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 по умолчанию.