it-swarm.com.de

Wie erzwinge ich die Weiterleitung aller 404-Dateien (oder jeder ungültigen oder nicht ungültigen Seite) auf die Startseite?

Derzeit ist jede ungültige Seite 500 (Interner Serverfehler), da ich wahrscheinlich meine Serverblockkonfiguration durcheinander gebracht habe.

Ich habe mich vor einiger Zeit entschlossen, meine Website zu schließen und eine einfache, einseitige Homepage zu erstellen. Alte Links und externe Websites versuchen jedoch weiterhin, auf andere Teile der Website zuzugreifen, die nicht mehr vorhanden sind.

Wie erzwinge ich die Weiterleitung aller Nicht-Startseite (ungültige URLs) auf die Startseite?

Ich habe es mit dem folgenden Block versucht, aber es hat nicht funktioniert:

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

Meine aktuelle Konfiguration ist (ich biete momentan nicht einmal PHP Dateien an, dh die Homepage ist einfach 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

So stellen Sie die Fehlerseite auf die Startseite ein

error_page 404 /index.html;

wenn ein kleines Problem vorliegt, lautet der Statuscode der Homepage "404 not found". Wenn Sie die Homepage mit einem "200 ok" -Statuscode laden möchten, sollten Sie dies folgendermaßen tun

error_page 404 =200 /index.html;

Dadurch wird der Fehlercode "404 not found" in einen Code "200 ok" konvertiert und die Homepage geladen

Die zweite Methode, die @jvperrin erwähnte, ist auch gut,

try_files $uri $uri/ /index.html;

sie müssen jedoch eines beachten, da es sich um den location / - Wert handelt, den jedes nicht mit einem anderen Speicherort übereinstimmt und der nicht gefunden wird. Außerdem wird der index.html - Wert geladen, z. B. fehlende Bilder, CSS, js-Dateien, aber in Ihrem Fall kann ich sehen, dass Sie bereits einen anderen Speicherort haben, der mit den Erweiterungen der Assets übereinstimmt, sodass Sie sich diesem Problem nicht stellen sollten.

41

So erhalten Sie eine echte Weiterleitung:

im serverblock definiere die fehlerseite die du umleiten willst wie folgt:

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

Dann definieren Sie diesen Ort:

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

In diesem Fall erzeugen die Fehler 404 und 500 HTTP 302 (temporäre Weiterleitung) zu/(kann natürlich eine beliebige URL sein).

Wenn Sie Fast-CGI für PHP oder andere verwenden, müssen diese Blöcke die folgenden hinzugefügt haben, um die Fehler "upstrem" an Server-Block zu senden:

fastcgi_intercept_errors on;
10

Fügen Sie nach Ihrer index -Definition die folgende Zeile hinzu:

error_page 404 /index.html;

Wenn das nicht funktioniert, ändern Sie Ihr try_files rufen Sie stattdessen Folgendes an:

try_files $uri $uri/ /index.html;

Hoffentlich funktioniert eine dieser Arbeiten für Sie, ich habe auch noch nicht getestet.

5
jvperrin

Diese Lösung für Nginx gehostete Website:

Bearbeiten Sie Ihre virtuelle Hosting-Datei

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

Fügen Sie dieses Snippet im Serverblock hinzu

# define error page
error_page 404 = @notfound;

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

Setzen Sie in Ihrem PHP-Block die Option fastcgi_intercept_errors auf 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;
}

Der endgültige Code wird so aussehen

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

Verwenden müssen

"fastcgi_intercept_errors on;"

zusammen mit der benutzerdefinierten Weiterleitungsposition wie error_page 404 =200 /index.html oder

wie oben

location @myownredirect {
  return 302 /;
}
1
Anto

Hallo, zuerst gibt es viele verschiedene Möglichkeiten, um alle 404 auf die Homepage umzuleiten

 fastcgi_intercept_errors on;

dann füge folgendes zu deiner Konfiguration hinzu

        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;

    }