Umleitung auf anderen Server und Domäne, wenn die Datei nicht gefunden wird

Umleitung auf anderen Server und Domäne, wenn die Datei nicht gefunden wird

Ich bin von Apache zu Nginx migriert und möchte daher alle Regeln in Nginx festlegen.

Ziel:Leiten Sie eine URL mit demselben Dateinamen auf eine andere Domäne um, wenn die Datei nicht auf dem angeforderten Server gefunden wird.

Beispiel

Wenn ein Benutzer öffnethttps://www.example.com/data/1.jpgdann wird mein Server versuchen, "1.jpg" im "data"-Verzeichnis zu finden. Wenn diese Datei nicht gefunden wird, wird der Benutzer zur URL des Backup-Servers weitergeleitet, wiehttps://www.example2.com/backup/1.jpg

Beispiel in .htaccess

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.*) - [L]
RewriteRule (.*) https://example2.com/backup/$1 [L]

Was ich versucht habe

  1. Ich habe nach vorhandenen Lösungen gesucht, aber keine funktionierende Lösung gefunden.
  2. Versuchen Sie, die Apache-Konfiguration über Konverter in eine Nginx-Konfiguration zu konvertieren, aber es funktioniert nicht.

Einige haben es mit der Konfiguration versucht, aber es hat nicht funktioniert.

    location ~ /data/.* {
        if (-e $request_filename){
            rewrite ^ https://www.example2.com/backup/$1 last;
        } 
    }


    location ~ /data/.* {
        if (-e $request_filename){
            rewrite ^ https://www.example2.com/backup/$1 permanent;
        } 
    }


    location ~ /data/.* {
        try_files $uri https://www.example2.com/backup/$uri;
    }

Antwort1

Ich habe die Lösung erhalten, nachdem ich die Antwort von @Rob geändert habe.

set $v_filename nf;

location ~ ^/data/(.*)$ {
    try_files  $uri  @externalbackup;
    set $v_filename $1;
}

location @externalbackup {
     return 301  https://www.example2.com/backup/$v_filename ;
}

Antwort2

In nginx würden Sie einentry_files Direktive, die den Inhalt einer lokalen Datei bereitstellt, wenn diese in einem (oder mehreren) lokalen Verzeichnissen vorhanden ist. Wenn keine Datei gefunden wird, erfolgt eine interne Umleitung zur im letzten Parameter angegebenen URI.

Da dies nicht extern umgeleitet werden kann, benötigen Sie ein wenig Trickserei und einen zweistufigen Ansatz. In den try_files-Optionen verwenden Sie den benannten Standort für diese interne Umleitung und erstellen von diesem benannten Standort aus die externe Umleitung.

location / {
    try_files  $uri  @externalbackup;
}

location @externalbackup {
     return 301  https://www.example2.com/backup$request_uri ;
}

Der obige Code ist ungetestet.

verwandte Informationen