Stephane
Stephane

Reputation: 12750

Static files served by Apache but not by Nginx

My PHP application static files are served all right when running Apache but they are denied access when running Nginx although both http servers use my own user (the one I log in my Linux machine with) as their user.

The issue therefore lies within the Nginx or php-fpm configuration.

Here is some of the nginx.conf content:

user  stephane;
worker_processes  1;
http {
  include       mime.types;
  default_type  application/octet-stream;
  sendfile        on;
  keepalive_timeout  65;
  gzip  on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
  upstream php5-fpm-sock {
    server unix:/home/stephane/programs/install/php5-fpm.sock;
  }
  server {
    listen       80;
    server_name  localhost;
    charset utf-8;
    location / {
      root   html;
      index  index.html index.htm;
    }
    location ~ \.php$ {
      try_files $uri = 404;
      fastcgi_index index.php;
      fastcgi_pass php5-fpm-sock;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
    }
    location ~ /\. {
      access_log off;
      log_not_found off;
      deny all;
    }
  }
  include conf.d/*.conf;
  include sites-enabled/*;
}

Here is the Nginx virtual host configuration:

server {
  listen 443;
  server_name dev.extrapack.group.com;
  root /home/stephane/dev/php/projects/Extrapack-Mon/public;

  ssl on;
  ssl_certificate /home/stephane/programs/install/nginx/conf/sites-available/extrapack.group.com.crt;
  ssl_certificate_key /home/stephane/programs/install/nginx/conf/sites-available/extrapack.group.com.key;

  location /simplesaml {
    index index.php;
    alias /usr/share/simplesaml/www;
    location ~ ^/simplesaml/(module\.php)(/.+)$ {
      include fastcgi_params;
      fastcgi_pass php5-fpm-sock;
      fastcgi_split_path_info ^/simplesaml/(module\.php)(/.+)$;
      fastcgi_param SCRIPT_FILENAME /usr/share/simplesaml/www/$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      fastcgi_index index.php;
    }
    location ~ \.php$ {
      include fastcgi_params;
      fastcgi_pass php5-fpm-sock;
    }
  }

  location / {
    include fastcgi_params;
    fastcgi_pass php5-fpm-sock;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    try_files $uri /index.php?$args;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param HTTPS 'on'; # Make PHP-FPM aware that this vhost is HTTPs enabled
    fastcgi_param APPLICATION_ENV development;
    fastcgi_index index.php;
  }
}

And the Apache virtual host configuration (that works fine accessing all the static resources):

<VirtualHost *:443>
ServerName dev.extrapack.group.com
DocumentRoot "/home/stephane/dev/php/projects/Extrapack-Mon/public"
<Directory "/home/stephane/dev/php/projects/Extrapack-Mon/public">
Options Indexes FollowSymLinks Includes
AllowOverride All           
Require all granted                 
</Directory>                            
</VirtualHost>

Upvotes: 0

Views: 2977

Answers (1)

Digitalkapitaen
Digitalkapitaen

Reputation: 2423

Replace your location / with these two locations:

location / {
  try_files $uri /index.php?$args;
}

location ~ [^/]\.php(/|$) {
  fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  if (!-f $document_root$fastcgi_script_name) {
    return 404;
  }
  include fastcgi_params;
  fastcgi_param PATH_INFO $fastcgi_path_info;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_pass php5-fpm-sock;
  fastcgi_param HTTPS 'on'; # Make PHP-FPM aware that this vhost is HTTPs enabled
  fastcgi_param APPLICATION_ENV development;
  fastcgi_index index.php;
}

The first location handles static files.

The second location handles .php files. Since it is a regexp-location (with ~) it has precedence over the first location if it matches, so .php-files get executed.

Upvotes: 1

Related Questions