Как заставить перенаправить все 404 (или каждую страницу, недействительно или нет) на домашнюю страницу?
В настоящее время каждая недопустимая страница составляет 500 (Internal Server Error), потому что я, вероятно, испортил конфигурацию своего сервера.
Я решил закрыть мой сайт некоторое время назад и создал простую одностраничную страницу с благодарностью. Однако старые ссылки и внешние сайты по-прежнему пытаются получить доступ к другим частям сайта, которые больше не существуют.
Как принудительно перенаправить всю домашнюю страницу (любой недопустимый URL) на главную страницу?
Я пробовал со следующим блоком, но это не сработало:
location / {
try_files $uri $uri/ $document_uri/index.html;
}
Моя текущая конфигурация (я даже не обслуживаю файлы PHP прямо сейчас, т.е. домашняя страница - это простой html):
server {
server_name www.example.com example.com;
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
root /srv/www/example.com/public_html;
index index.php index.html;
location / {
try_files $uri $uri/ $document_uri/index.html;
}
# Disable favicon.ico logging
location = /favicon.ico {
log_not_found off;
access_log off;
}
# Allow robots and disable logging
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# Enable permalink structures
if (!-e $request_filename) {
rewrite . /index.php last;
}
# Handle php requests
location ~ \.php$ {
try_files $uri = 404;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_send_timeout 900;
fastcgi_read_timeout 900;
fastcgi_connect_timeout 900;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# Disable static content logging and set cache time to max
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
access_log off;
log_not_found off;
expires max;
}
# Deny access to htaccess and htpasswd files
location ~ /\.ht {
deny all;
}
# Deny access to hidden files (beginning with a period)
location ~ /\. {
access_log off; log_not_found off; deny all;
}
}
Ответы
Ответ 1
Установка страницы ошибки на домашнюю страницу, например
error_page 404 /index.html;
имеет небольшую проблему, код состояния домашней страницы будет "404 не найден", если вы хотите загрузить домашнюю страницу с кодом состояния "200 ok", вы должны сделать это следующим образом:
error_page 404 =200 /index.html;
Это преобразует код ошибки "404 не найден" в код "200 ok" и загрузит домашнюю страницу
Второй метод, который упоминал @jvperrin, тоже хорош,
try_files $uri $uri/ /index.html;
но вам нужно помнить о том, что location /
любой актив, который не соответствует другому местоположению и не найден, также загрузит index.html
, например, отсутствующие изображения, css, js файлы, но в вашем случае я вижу, что у вас уже есть другое место, которое соответствует расширениям активов, поэтому вам не стоит сталкиваться с этой проблемой.
Ответ 2
Чтобы получить истинное перенаправление, вы можете сделать это:
в serverblock укажите страницу с ошибкой, которую вы хотите перенаправить следующим образом:
# define error page
error_page 404 = @myownredirect;
error_page 500 = @myownredirect;
Затем вы определяете это местоположение:
# error page location redirect 302
location @myownredirect {
return 302 /;
}
В этом случае ошибки 404 и 500 генерируют HTTP 302 (временное перенаправление) в/(может, конечно, любой URL-адрес)
Если вы используете fast-cgi для php или других, эти блоки должны иметь следующее добавление для отправки ошибок "upstrem" на сервер-блок:
fastcgi_intercept_errors on;
Ответ 3
Попробуйте добавить следующую строку после определения index
:
error_page 404 /index.html;
Если это не сработает, попробуйте вместо этого изменить ваш вызов try_files
на следующее:
try_files $uri $uri/ /index.html;
Надеюсь, одна из этих работ для вас, я еще не тестировал.
Ответ 4
Это решение для размещенного сайта nginx:
Отредактируйте ваш файл виртуального хостинга
sudo nano /etc/nginx/sites-available/vishnuku.com
Добавьте этот фрагмент в блок сервера
# define error page
error_page 404 = @notfound;
# error page location redirect 301
location @notfound {
return 301 /;
}
В вашем php-блоке установите fastcgi_intercept_errors в значение on
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
# intercept errors for 404 redirect
fastcgi_intercept_errors on;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Конечный код будет выглядеть так
server {
listen 80;
server_name vishnuku.com;
root /var/www/nginx/vishnuku.com;
index index.php index.html;
access_log /var/log/nginx/vishnuku.com.log;
error_log /var/log/nginx/vishnuku.com.error.log;
location / {
try_files $uri $uri/ /index.php?$args /;
}
# define error page
error_page 404 = @notfound;
# error page location redirect 301
location @notfound {
return 301 /;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
location = /nginx.conf {
deny all;
}
}
Ответ 5
Необходимо использовать
"fastcgi_intercept_errors on;"
вместе с настраиваемым местоположением перенаправления, например
error_page 404 =200 /index.html
или
как указано выше
location @myownredirect {
return 302 /;
}
Ответ 6
Привет сначала есть много разных способов перенаправить все 404 на домашнюю страницу
это помогает вам в SEO
сделать так, чтобы вы использовали
fastcgi_intercept_errors on;
затем добавьте это в свой конфиг
error_page 404 =301 http://yourdomain.com/;
error_page 403 /error403.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html;
}