2016-10-03 3 views
0

Ich versuche Nginx meinen authentifizierten Admin-Benutzern einige statische Dateien mit PHP zu liefern. Das funktioniert super, ich bekomme die Datei zurück. Aber es ist mit einem 404-Statuscode serviert ..Nginx Serving statische Dateien mit 404 Statuscode?

Ich bin mit dem folgenden (Symfony/Silex) PHP-Code:

use Symfony\Component\HttpFoundation\BinaryFileResponse; 
use Symfony\Component\HttpFoundation\ResponseHeaderBag; 

$filePath = '/usr/share/nginx/project/src/path/to/my/protected/static/dir/' . $file; 
if (empty($file) || !is_readable($filePath)) { 
    $app->abort(404); 
} 

$response = new BinaryFileResponse($filePath); 
$response->trustXSendfileTypeHeader(); 
$response->setPrivate(); 
$response->setContentDisposition(
    ResponseHeaderBag::DISPOSITION_INLINE, 
    $file, 
    iconv('UTF-8', 'ASCII//TRANSLIT', $file) 
); 
$response->headers->addCacheControlDirective('must-revalidate', true); 
return $response; 

Und hier ist meine nginx config:

server { 
    listen   443; 
    listen   [::]:443; 

    root   /usr/share/nginx/project/web; 
    index   index.php; 
    error_page  401 403 404 /404.html; 

    server_name  example.com; 

    rewrite ^/(.*)/$ /$1 permanent; 

    location/{ 
     # First attempt to serve request as file, then 
     # as directory, then let php handle the file 
     try_files $uri $uri/ /index.php$is_args$args; 
     index index.php; 
     autoindex off; 

     location ~* \.(svg|jpg|jpeg|png|gif|ico|css|js)$ { 
      expires 150d; 
     } 
    } 

    location ~ \.php$ { 
     set $path_info $fastcgi_path_info; 
     fastcgi_index index.php; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 

     try_files $uri $uri/ /index.php$is_args$args; 
     fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 

     include fastcgi_params; 
     fastcgi_param APP_ENV production; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    } 
} 

Der geschützte Dir liegt außerhalb der Wurzel in der Nginx-Konfiguration (/usr/share/nginx/project/web).

Ich habe diese Art von Fehlermeldungen in den Protokollen gefunden:

open() "/usr/share/nginx/project/web/admin/static/admin.js" failed 
(2: No such file or directory), 
request: "GET /admin/static/admin.js HTTP/1.1" 

Wo /admin/static/admin.js war in der Tat die angeforderte URL.

Update 1

Es ist wie nginx sieht immer versucht, die URL zu öffnen, und fügt einen Eintrag in das Fehlerprotokoll auch PHP die Antwort nur gut behandelt.

Selbst wenn ich all PHP-Code ersetzen für nur: return new Response('test', 200); den Antwortcode für den Körper ‚Test‘ ist nach wie vor 404 ...

Ich habe auch versucht, einen zusätzlichen Standort Block in meiner nginx Konfiguration hinzu:

location /protected_admin_files { 
    internal; 
    alias /usr/share/nginx/project/src/path/to/my/protected/static/dir; 
} 

Und dann versuchen, die Datei wie folgt umgeleitet werden:

return new Response('', 200, [ 
    'X-Accel-Redirect' => '/protected_admin_files/' . $file 
]); 

Aber auch ohne Glück. Same 404 mit der richtigen Antwort Körper ...

+0

Wenn Sie Terminalzugriff haben, führen Sie '$ pwd' in Ihrem statischen Ordner aus – Derek

+0

und dann würde ich diesen Ort mit der Ausgabe von '$ filePath = __DIR__ 'vergleichen./Src/Pfad/zu/my/protected/static/dir /';' – Derek

+0

Beachten Sie, dass PHP Zugriff auf die Datei als die Benutzer-ID, unter der der Webserver läuft (oft "nobody") Einschränkungen im abgesicherten Modus werden vor PHP 5.1.5 nicht berücksichtigt. – Derek

Antwort

2

Ich habe die Ursache selbst gefunden ..

Das war, was ich im Fehlerprotokoll gefunden einmal habe ich die Fehlerstufe auf debug (here's the full log)

... 
[debug] rewrite phase: 1 
[debug] http script regex: "^/(.*)/$" 
[notice] "^/(.*)/$" does not match "/admin/static/admin.js", request: "GET /admin/static/admin.js HTTP/1.1", host: "example.com" 
[debug] test location: "/" 
[debug] test location: "protected_admin_files" 
[debug] test location: ~ "\.(svg|jpg|jpeg|png|gif|ico|css|js)$" 
[debug] using configuration "\.(svg|jpg|jpeg|png|gif|ico|css|js)$" 
... 
[debug] http filename: "/usr/share/nginx/project/web/admin/static/admin.js" 
[debug] add cleanup: 00000000025AE108 
[error] open() "/usr/share/nginx/project/web/admin/static/admin.js" failed (2: No such file or directory), client: 24.132.134.203, server: example.com, request: "GET /admin/static/admin.js HTTP/1.1", host: "example.com" 
[debug] http finalize request: 404, "/admin/static/admin.js?" a:1, c:1 
[debug] http special response: 404, "/admin/static/admin.js?" 
[debug] internal redirect: "/index.php?" 
... 

Offenbar ist die verschachtelten location in meinem ersten ersten location / Block verursacht wurde die 404.

location/{ 
    try_files $uri $uri/ /index.php$is_args$args; 
    index index.php; 
    autoindex off; 

    location ~* \.(svg|jpg|jpeg|png|gif|ico|css|js)$ { 
     expires 150d; 
    } 
} 

Es wurde wegen der Erweiterung abgeglichen, wodurch Nginx nach der Datei sucht. Da es dann nicht gefunden wird, wird das 404 gesetzt und scheinbar später nicht überschrieben, wenn php den X-Accel-Redirect-Header zurückgibt :(.

Verwandte Themen