it-swarm.com.de

Nginx deny-all kann den PHP Code in 403.html nicht ausführen

Ich möchte den Zugriff auf einige Verzeichnisse und Dateien verweigern, daher verwende ich die Option deny_all, um eine 403.html-Seite zurückzugeben. Es erlaubt mir jedoch nicht, PHP Code auf dieser Seite auszuführen.

Etwas mit "intern" zu tun? Soll ich stattdessen "return" oder "error_page" verwenden?

Hier ist meine Konfiguration, alle anderen Vorschläge sind willkommen ...

#
#  Redirect all to www
#
server 
{
    listen 80;

    server_name site.com;
    return 301 $scheme://www.site.com$request_uri;
}

#
#  Validate and process requests
#
server 
{
    listen 80;

    server_name www.site.com *.site.com;

    root /var/www/site.com;
    index index.html;
#
#  Error and Access logs
#
    error_log /var/log/nginx/error.site.log notice;
    access_log /var/log/nginx/access.site.log;

    error_page 403 /Src/403.html;
    location = /Src/403.html 
    {
      internal;
    }

    error_page 404 /Src/404.html;
    location = /Src/404.html 
    {
      internal;
    }

    location / 
    {
      try_files $uri $uri/ =404;
    }

    location ~ \.(py|sh|tgz|xml)$ 
    {
      deny all;
    }

    location ~ \.(html|php)$ 
    {
      include fastcgi.conf;
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.html;
      try_files $uri.html $uri.php $uri/ =404;
    }
1
Alph

Das Problem ist das location selbst. nginx wählt einen location aus, der eine Anfrage bearbeitet. Im Fall von /Src/403.html hat der Block location = /Src/404.html Vorrang vor dem Block location ~ \.(html|php)$, was bedeutet, dass keine der Anweisungen PHP enthalten ist. Siehe dieses Dokument für Details.

Wenn es Ihnen wichtig ist, dass der URI /Src/403.html intern bleibt, fügen Sie die erforderlichen Anweisungen in diesen Block location ein. Zum Beispiel:

error_page 403 /Src/403.html;
location = /Src/403.html 
{
    internal;
    include fastcgi.conf;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
} 

Andernfalls können Sie einfach den gesamten Positionsblock löschen. In diesem Fall wird der URI /Src/403.html vom Block location ~ \.(html|php)$ verarbeitet.

1
Richard Smith