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;
}
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)$
.