Как заставить перенаправить все 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;

    }