Nginx 下载 php 文件-可能原因:正则表达式

Nginx 下载 php 文件-可能原因:正则表达式

问题

我试图拒绝访问我的 Web 根目录中的两个文件 update.php、install.php,并要求对 apc.php(也是 Web 根目录)进行身份验证。

我认为我已经成功拒绝访问,但打开文件时它会被下载而不是运行。

例如,在输入我的 IPADDRESS/apc.php 身份验证后,它会下载到我的计算机而不是打开。update.php 也会发生同样的事情。

如果我删除引用这三个文件的块,它就会成功运行,但当然它们不会被阻止。我该如何解决这个问题?

迄今为止

(我已重新排列,将相关部分放在顶部。)

我认为问题是这样的:

我唯一能找到的匹配位置是 ^~,其他所有位置都被忽略了(为什么?),表达式 ^~ 在匹配后停止搜索,所以我认为它永远找不到 PHP 块。所以它会下载而不是运行。

我尝试将 php 配置添加到块中,如下所示:

location ^~ /update.php {
      allow 127.0.0.1;
      deny all;
      fastcgi_param SCRIPT_FILENAME /srv/www/mysite/public$fastcgi_script_name;
      fastcgi_pass 127.0.0.1:9000;
      include /etc/nginx/fastcgi_params;
}

但这只会导致页面变得空白。

服务器配置

server {
      listen 8080;
        server_name website website.com;
        access_log /srv/www/website/logs/access.log;
        error_log /srv/www/website/logs/error.log;
        root /srv/www/website/public;


        location / {
           index index.php index.html index.htm;
           error_page 404 = @drupal;
        }

        ##deny access to update and install for everyone except the server
        location ^~ /update.php {
            allow 127.0.0.1;
            deny all;
        }

        location ^~ /install.php {
            allow 127.0.0.1;
            deny all;
        }


        ##authentication required to access apc.php
        location ^~ /apc.php {
            auth_basic "Restricted access"; #realm
            auth_basic_user_file /srv/www/website/public/.htpasswd-users;
        }

        ##drupal rewrite rules
        location @drupal {
            rewrite ^(.*)$ /index.php?q=$1 last;
        }

        ##secure private file directory
        location ~* /privatefiles {
             internal;
        }

        ##Add headers to advagg
        location ~* files/advagg_(?:css|js)/ {
            access_log off;
            expires    max;
            add_header ETag "";
            add_header Cache-Control "max-age=290304000, no-transform, public";
            add_header Last-Modified "Wed, 20 Jan 1988 04:20:42 GMT";
            try_files  $uri @drupal;
        }

        ## Replicate the Apache <FilesMatch> directive of Drupal standard
        ## .htaccess. Disable access to any code files. Return a 404 to curtail
        ## information disclosure. Hide also the text files.
        location ~* ^(?:.+\.(?:htaccess|make|txt|log|engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(?:\.php)?|xtmpl)|code-style\.pl|/Entries.*|/Repository|/Root|/Tag|/Template)$ {
            return 404;
        }

        location ~ \..*/.*\.php$ {
            return 403;
        }

        ##rules for running php
        location ~ \.php$ {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;
            if ($uri !~ "^/default/files/") {
                fastcgi_pass 127.0.0.1:9000;
            }
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /srv/www/website/public$fastcgi_script_name;
         }


 }

答案1

可能是这样的表达

location ^~ /...

错了吗?难道不应该是:

location ~ ^/... 

这里为什么需要正则表达式?

location /install.php

应该可以。

相关内容