Nginx成功地用密码保护了PHP文件,但随后提示您下载它们

som*_*me1 2 php nginx .htpasswd

在上一个问题中,我尝试使用带有.htpasswd和regex的Nginx密码保护我的/ admin /和子文件夹目录。

该操作已成功完成,但是现在,密码验证完成后,Nginx会提示“下载” php文件,而不是简单地加载它们。

当新位置“身份验证”块被注释掉时,不会发生这种情况。例如,在此代码示例中,PHP页面加载没有任何问题:

    location / {
            try_files $uri $uri/ =404;
    }

    #location "~^/admin/.*$" {
    #       try_files $uri $uri/ =404;
    #       auth_basic "Restricted";
    #       auth_basic_user_file /etc/nginx/.htpasswd;
    #}

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
    }
Run Code Online (Sandbox Code Playgroud)

我该如何解决这些(显然是冲突的)位置块,所以/ admin /部分受密码保护,但php文件仍然加载?

Ric*_*ith 5

问题是关于如何nginx处理请求的根本误解。基本上,nginx选择一个位置来处理请求。

您要nginx处理以/admin要求的位置块开头的URI auth_basic。另外,以URI结尾的URI .php必须发送到PHP7。

因此,您需要两个fastcgi块,一个用于处理普通的PHP文件,另一个用于处理受限制的PHP文件。

location指令有几种形式。您已经发现正则表达式的位置是有序的,因此您的location "~^/admin/.*$"块可以有效地阻止该location ~ \.php$块看到以开头/admin和结尾的任何URI .php

一个干净的解决方案是使用嵌套的位置块并使用^~修饰符,该修饰符强制前缀位置优先于正则表达式位置:

location / {
    try_files $uri $uri/ =404;
}

location ~ \.php$ {
    try_files $uri =404;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}

location ^~ /admin/ {
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;

    try_files $uri $uri/ =404;

    location ~ \.php$ {
        try_files $uri =404;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这location ^~是前缀位置,而不是正则表达式位置。

还要注意,在块中不需要fastcgi_split_path_infofastcgi_index指令location ~ \.php$