Negando pasta no Nginx fazendo com que o PHP-FPM não tenha precedência

5

O título diz tudo, mas eu tenho um problema muito interessante sobre o qual estou bastante confuso. Basicamente, eu tenho uma instalação simples do WordPress, e eu desejo negar uma pasta (junto com todos os arquivos na pasta), digamos / wp-content / themes / default / scripts, mas para permitir certos IPs.

Eu posso negar esta pasta com a localização ^~/wp-content/themes/default/scripts {deny all;} , como qualquer guru do Nginx lhe dirá.

Mas, pelo que entendi, o "^" tem maior precedência e irá parar de procurar por outros blocos de localização assim que encontrar a correspondência de expressão regular. Como eu não quero negar a pasta para todos (é claro, usar allow (IP Address); , meu bloco ^~/wp-content/... location desliga totalmente meu bloco de localização do PHP-FPM para passar o arquivo para o servidor FastCGI. E claro, quando Eu tento ver qualquer arquivo na pasta, o arquivo PHP é baixado diretamente como o PHP não está analisando.

Alguém tem uma ideia? Eu quero bloquear a pasta, mas para o PHP funcionar ao mesmo tempo para os usuários que eu decido permitir. Essa é a pergunta complicada; Não consigo encontrar nenhuma resposta para o problema.

Obrigado pessoal! Realmente agradeço sua ajuda!

Para qualquer pessoa que esteja se perguntando, minha configuração atual de vhost do Nginx parece com a seguinte:

server {
    #..all of the common stuff you would expect

    include /folder/nginx.conf; #including some WordPress rewrites for W3 Total Cache

    # pass the PHP scripts to FastCGI server listening on UNIX socket
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
        fastcgi_read_timeout 1900;
    }

    location / {
        #allowing some IPs...

        #deny everyone else
        deny all;

        #WordPress rewrite for slugs
        index index.php;
        if (!-e $request_filename) {
            rewrite ^(.*)$  /index.php last;
        }

        #rewrite for sitemaps
        rewrite ^(.*/)?sitemap.xml /wp-content/sitemap.php last;

    }

    # denying access to .htaccess files
    location ~ /\.ht {
            deny  all;
    }
}
    
por Taylor Jasko 11.02.2012 / 18:17

2 respostas

3

Finalmente encontrei a resposta. Quando você está fazendo algo assim, você precisa redeclarar as configurações do PHP-FPM (todas as coisas que estavam no bloco location ~ \.php$ { (this code) } .

Então, para evitar a redundância, coloquei esses valores em outro arquivo e fiquei com algo parecido com isto:

server {

        # pass the PHP scripts to FastCGI server listening on UNIX socket
        location ~ \.php$ {
                include /etc/nginx/fastcgi_php_text;
        }

        location / {
                index index.php;
        }

        location ^~/folder/ {
                deny all;
                allow ...;

                include /etc/nginx/fastcgi_php_text;
        }
}

Não faço ideia se esta é a melhor maneira de fazer isso, mas essa é a única maneira que descobri.

    
por 18.02.2012 / 23:59
1

Você também pode tentar definir um bloco de local por @name e fazer referência a ele. De página nginx Pitfalls

server {

        location ~ \.php$ {
            try_files      @fascgi;
        }

        location ^~ /folder {
            deny           all;
            allow          127.0.0.1;
            location ~ \.php$ {
                try_files  @fascgi;
            }
        }

        location @fascgi {
            fastcgi_pass   127.0.0.1:9000;
            include        fastcgi_params;
        }

}
    
por 16.12.2014 / 12:06