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