web-dev-qa-db-fra.com

Comment forcer la redirection de tous les 404 (ou de toutes les pages, invalides ou non) vers la page d'accueil?

Actuellement, chaque page non valide est de 500 (erreur interne du serveur) car j'ai probablement foiré la configuration de mon bloc serveur.

J'ai décidé de fermer mon site Web il y a quelque temps et j'ai créé une simple page d'accueil d'une page de remerciement. Cependant, d'anciens liens et sites externes tentent toujours d'accéder à d'autres parties du site, qui n'existe plus.

Comment forcer la redirection de toutes les pages non d'accueil (toute URL non valide) vers la page d'accueil?

J'ai essayé avec le bloc suivant, mais cela n'a pas fonctionné:

location / {
    try_files $uri $uri/ $document_uri/index.html;
}

Ma configuration actuelle est (je ne sers même pas de fichiers PHP pour le moment, c'est-à-dire que la page d'accueil est du simple 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;
    }
}
26
hobbes3

Définir la page d'erreur sur la page d'accueil comme ceci

error_page 404 /index.html;

a un petit problème, le code d'état de la page d'accueil sera "404 introuvable", si vous voulez charger la page d'accueil avec un code d'état "200 ok" vous devez le faire comme ceci

error_page 404 =200 /index.html;

Cela convertira le code d'erreur "404 non trouvé" en un code "200 ok" et chargera la page d'accueil

La deuxième méthode mentionnée par @jvperrin est également bonne,

try_files $uri $uri/ /index.html;

mais vous devez garder une chose à l'esprit, car c'est le location / tout élément qui ne correspond à aucun autre emplacement et qui n'est pas trouvé chargera également le index.html, par exemple des images manquantes, des fichiers css, js, mais dans votre cas, je peux voir que vous avez déjà un autre emplacement qui correspond aux extensions des actifs, vous ne devriez donc pas faire face à ce problème.

41
Mohammad AbuShady

Pour obtenir une véritable redirection, vous pouvez procéder comme suit:

dans serverblock définissez la page d'erreur que vous souhaitez rediriger comme ceci:

# define error page
error_page 404 = @myownredirect;
error_page 500 = @myownredirect;

Ensuite, vous définissez cet emplacement:

# error page location redirect 302
location @myownredirect {
  return 302 /;
}

Dans ce cas, les erreurs 404 et 500 génèrent HTTP 302 (redirection temporaire) vers/(pourrait bien sûr être n'importe quelle URL)

Si vous utilisez fast-cgi pour php ou autre, ces blocs doivent avoir les éléments suivants ajoutés pour envoyer les erreurs "upstrem" à server-block:

fastcgi_intercept_errors on;
10
Fredrik Edentoft

Essayez d'ajouter la ligne suivante après votre définition index:

error_page 404 /index.html;

Si cela ne fonctionne pas, essayez de changer votre try_files appelez plutôt ce qui suit:

try_files $uri $uri/ /index.html;

J'espère que l'un de ces travaux pour vous, je n'ai pas encore testé non plus.

5
jvperrin

Cette solution pour site hébergé nginx:

Modifiez votre fichier d'hébergement virtuel

Sudo nano /etc/nginx/sites-available/vishnuku.com 

Ajouter cet extrait dans le bloc serveur

# define error page
error_page 404 = @notfound;

# error page location redirect 301
location @notfound {
    return 301 /;
}

Dans votre bloc php, mettez le fastcgi_intercept_errors sur

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;
}

Le code final ressemblera à ceci

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;
    }
}
3
Vishnu

Doit utiliser

"fastcgi_intercept_errors on;"

ainsi que l'emplacement de redirection personnalisé comme error_page 404 =200 /index.html ou

comme ci-dessus

location @myownredirect {
  return 302 /;
}
1
Anto

Salut d'abord, il existe de nombreuses façons de rediriger tous les 404 vers la page d'accueil, cela vous aide dans le référencement à utiliser

 fastcgi_intercept_errors on;

que d'ajouter ceci à votre configuration

        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;

    }
0