Puncte:2

Redirecționați către alt server și domeniu dacă fișierul nu a fost găsit

drapel sd

Am migrat de la Apache la Nginx, așa că vreau să stabilesc toate regulile în Nginx.

Poartă: Redirecționați o adresă URL către un alt domeniu cu același nume de fișier dacă acel fișier nu este găsit pe serverul solicitat.

Exemplu

Dacă un utilizator deschide https://www.example.com/data/1.jpg atunci serverul meu va încerca să găsească „1.jpg” în directorul „date”. Dacă acel fișier nu este găsit, redirecționați utilizatorul la adresa URL a serverului de rezervă, cum ar fi https://www.example2.com/backup/1.jpg

Exemplu în .htaccess

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

Ce am incercat

  1. Caută soluții existente, dar nu am găsit nicio soluție de lucru.
  2. Încercați să convertiți apache config în Nginx config prin convertoare, dar nu funcționează.

Unii au încercat configurarea, dar nu funcționează.

    locație ~ /data/.* {
        dacă (-e $nume_fișier_cerere){
            rescrie ^ https://www.example2.com/backup/$1 ultimul;
        } 
    }


    locație ~ /data/.* {
        dacă (-e $nume_fișier_cerere){
            rescrie ^ https://www.example2.com/backup/$1 permanent;
        } 
    }


    locație ~ /data/.* {
        try_files $uri https://www.example2.com/backup/$uri;
    }
drapel kz
În exemplul dvs., redirecționați de la `example.com/data/1.jpg` la `example2.com/backup/1.jpg` - este intenționat? Sau ar trebui să fie `example2.com/backup/data/1.jpg` (care este ceea ce presupune codul dvs. și răspunsul actual)?
Shubham Panchal avatar
drapel sd
Da, example2.com/backup/1.jpg este intenționat.
Puncte:1
drapel sd

Am primit soluția după modificarea răspunsului @Rob.

set $v_filename nf;

locație ~ ^/date/(.*)$ {
    try_files $uri @externalbackup;
    setați $v_filename $1;
}

locație @externalbackup {
     returnează 301 https://www.example2.com/backup/$v_filename ;
}
Puncte:1
drapel us
Rob

În nginx ați folosi un try_files directivă, care servește conținutul dintr-un fișier local, dacă acesta există într-unul (sau mai multe) directoare locale. Când nu este găsit niciun fișier, se face o redirecționare internă către uri specificată în ultimul parametru.

Deoarece acest lucru nu poate redirecționa extern, aveți nevoie de puțină înșelăciune și de o abordare pe două niveluri. În opțiunile try_files folosiți locația numită pentru acea redirecționare internă și din acea locație numită construiți redirecționarea externă.

Locație / {
    try_files $uri @externalbackup;
}

locație @externalbackup {
     returnează 301 https://www.example2.com/backup$request_uri ;
}

Codul de mai sus este netestat.

drapel kz
Aș crede că acest tip de redirecționare ar trebui să fie un 302 (temporar) dacă există vreo intenție ca fișierul solicitat inițial să existe în viitor.
Shubham Panchal avatar
drapel sd
Mulțumesc @Rob pentru răspuns. Am încercat acest lucru și redirecționarea funcționează, dar numele fișierului nu funcționează în URL-ul redirecționat. Este ca: https://www.example2.com/backup Dar ar trebui să: https://www.example2.com/backup/file_name_here

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.