I'm trying to achieve following thing. I've main website under domain root directory. It's working fine. i.e PHP files are executed. After some time I've added "auth" directory with basic HTTP authentication. Next, I uploaded PHP program into "auth" directory, but PHP files are downloading instead of executing.
- domain.name/test.php -> executing
- domain.name/sub/file.php -> executing
- domain.name/auth/protected.php -> downloading instead of executing
Here is sites-available conf
server { charset utf-8; listen 80 default_server; listen [::]:80 default_server; root /var/www/html; # Add index.php to the list if you are using PHP index index.php index.html index.htm index.nginx-debian.html; server_name xxx.com; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; try_files $uri $uri/ /index.php?$args; } location ^~ /auth { auth_basic "Restricted Content"; auth_basic_user_file /var/www/html/auth/.htpasswd; } location ^~ /protected { deny all; } location ~ \.php$ { include snippets/fastcgi-php.conf; # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; } location ~ /\.(ht|git|svn) { deny all; } }
Currently I've following solution, but I believe it's not a right way.
location ^~ /auth { auth_basic "Restricted Content"; auth_basic_user_file /var/www/html/auth/.htpasswd; location ~ \.php$ { include snippets/fastcgi-php.conf; # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; } }
Following solution doesn't work
location ^~ /auth { auth_basic "Restricted Content"; auth_basic_user_file /var/www/html/auth/.htpasswd; try_files $uri @php-fpm; } location @php-fpm { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php5-fpm.sock; }
Had the same issue!
Found the answer here, http://www.ceus-now.com/nginx-password-protect-directory-downloads-source-code/
Because we are adding ^~ we are leaving behind some other settings (not sure why we need to add this but it was the only way to get it to actually pull up the authentication :( )
I tried various combinations to see what was/not needed and each line is needed. I wish I understood these things better.
UPDATE: July 27th 2016:
So I did some reading and finally understand why we have this issue.
In short when we install FastCGI and php-fpm it creates a directive in the nginx server files (which file depends on your server install).
So in mine I have the following...
As you will notice these directives are in location / and not in the global settings. Since we want to secure a particular folder these directives are not inherited. Therefore, we need to declare it again.
If we wanted to follow the DRY ("Don't Repeat Yourself") principle, then we would declare the PHP-fpm and FastCGI in the global settings. We can do this by moving it to below (example, but it just needs to be outside of location directive). Here is an example.
Hope this helps. I realized the above by reading https://www.digitalocean.com/community/tutorials/understanding-and-implementing-fastcgi-proxying-in-nginx
Disclaimer: I am no pro so if you see mistakes be nice and just let me know and I will hopefully update.