internal în Nginx

Blocuri de bază Toate versiunile Nginx

Face un bloc location accesibil doar prin redirecționări interne (error_page, try_files, X-Accel-Redirect), nu direct din browser.

Sintaxă
location /cale/ {
    internal;
}

Ce face internal

Un location marcat cu internal; răspunde cu 404 Not Found la cererile venite direct de la client. Este folosit doar când Nginx ajunge acolo singur: printr-un error_page, index, try_files, rewrite, o subcerere (auth_request) sau antetul X-Accel-Redirect trimis de aplicație.

Cazul cel mai util este descărcarea protejată: aplicația PHP verifică dacă utilizatorul are dreptul la fișier și răspunde doar cu antetul X-Accel-Redirect: /protejat/factura.pdf. Nginx trimite apoi fișierul eficient, iar adresa /protejat/ nu poate fi accesată direct.

Nginx limitează redirecționările interne la 10 pentru o cerere, ca să evite buclele infinite (eroarea rewrite or internal redirection cycle).

Parametri

Parametru Descriere
Context location.
Fără argumente Directiva nu primește valori.

Ce returnează

404 pentru cererile externe; conținutul normal pentru redirecționările interne.

Exemple

Exemplul 1: Descărcări verificate de PHP (X-Accel-Redirect)

Fișierele stau în afara directorului public. PHP verifică dreptul și îi spune lui Nginx ce fișier să trimită.

# configurația Nginx
location /protejat/ {
    internal;
    alias /var/www/facturi/;
}

# descarca.php
<?php
if (!utilizator_are_acces($_GET['id'])) {
    http_response_code(403);
    exit;
}
header('Content-Type: application/pdf');
header('X-Accel-Redirect: /protejat/factura-1042.pdf');

Exemplul 2: Cerere directă față de cerere prin aplicație

curl -I https://exemplu.ro/protejat/factura-1042.pdf
curl -I -b sesiune=ana https://exemplu.ro/descarca.php?id=1042

Ieșire în terminal

HTTP/2 404
server: nginx
content-type: text/html

HTTP/2 200
server: nginx
content-type: application/pdf
content-length: 84512

Exemplul 3: Pagini de eroare care nu pot fi deschise direct

error_page 404 /erori/404.html;

location /erori/ {
    internal;
    root /var/www/exemplu.ro;
}

Greșeli frecvente

  • Pui internal pe un location folosit și de linkurile din pagini: vizitatorii primesc 404.
  • Folosești X-Accel-Redirect cu calea reală de pe disc (/var/www/facturi/...). Antetul primește un URI, care trebuie să se potrivească unui location din Nginx.