web-dev-qa-db-fra.com

Nginx nie-tout ne parvient pas à exécuter PHP code dans 403.html

Je souhaite refuser l'accès à certains répertoires et fichiers, j'utilise donc l'option deny_all pour renvoyer une page 403.html. Cependant, cela ne me permet pas d'exécuter le code PHP de cette page.

Quelque chose à voir avec "interne"? Devrais-je utiliser "return" ou "error_page" à la place?

Voici ma config, toute autre suggestion appréciée ...

#
#  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

Le problème est la location elle-même. nginx choisit un location traiter une requête. Dans le cas de /Src/403.html, le bloc location = /Src/404.html prime sur le bloc location ~ \.(html|php)$, ce qui signifie qu'aucune des directives PHP n'est incluse. Voir ce document pour plus de détails.

Si vous voulez que l'URI /Src/403.html reste interne, incluez les directives nécessaires dans ce bloc location. Par exemple:

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

Sinon, vous pouvez simplement supprimer le bloc d'emplacement entier. Dans ce cas, le /Src/403.html URI sera traité par le bloc location ~ \.(html|php)$.

1
Richard Smith