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 ...
Wenn Sie Terminalzugriff haben, führen Sie '$ pwd' in Ihrem statischen Ordner aus – Derek
und dann würde ich diesen Ort mit der Ausgabe von '$ filePath = __DIR__ 'vergleichen./Src/Pfad/zu/my/protected/static/dir /';' – Derek
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