Por que minha regra de localização Nginx não está tomando precedência?

2

Eu tenho um aplicativo PHP (Wordpress) na pasta raiz do meu site, e todas as solicitações para o site passam por ele alegremente.

No entanto, eu tenho uma subpasta, _links, que eu gostaria de usar para executar outro script php diferente.

Por exemplo, se um usuário acessar site.com/_links/221312, o script index.php de / _links assumirá.

Eu anteriormente usei um arquivo .htaccess para conseguir isso, mas desde que mudei para o nginx eu não consigo fazer isso funcionar.

Aqui está o antigo arquivo .htaccess.

RewriteEngine On
RewriteRule    ^([0-9]+)/?$    index.php?linkid=$1    [NC,L]

Obviamente, estou passando o último bit da URL para o script como um parâmetro.

Aqui está minha configuração nginx. Pedidos para, por exemplo, site.com/_links/23423, são selecionados por if (!-e $request_filename) e reescritos para /index.php?q=/_links/23423 , em vez de serem escolhidos pelo bloco de localização.

server {
        listen  127.0.0.1:8080;
        server_name site.com www.site.com m.site.com;

        root /var/www/site;
        location ^~ /_links/ {
                add_header location 1;
                root /var/www/site/_links;
                rewrite "^([0-9]+)/?$" /index.php?linkid=$1 break;
                location ~ \.php$ {
                        try_files $uri =404;
                        fastcgi_pass unix:/var/run/php5-fpm.sock;
                        fastcgi_index index.php;
                        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                        include fastcgi_params;

                }

        }
        index index.php index.html;
        if (!-e $request_filename)
            {
                rewrite ^(.+)$ /index.php?q=$1 last;
            }
        location / {
                try_files $uri $uri/ =404;
        }

        # pass the PHP scripts to FastCGI server listening on the php-fpm socket
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;

        }
        access_log /var/log/nginx/site.com.access.log;
        error_log /var/log/nginx/site.com.error.log notice;
}

Estou muito confuso. O que está acontecendo aqui?

    
por djb 09.11.2014 / 12:21

2 respostas

3

Talvez devido à correspondência de prefixo ( ^~ ) no bloco de localização e nginx esteja ignorando a regex verifique :

If the longest matching prefix location has the “^~” modifier then regular expressions are not checked

Tente remover a verificação de prefixo, por exemplo:

location /_links/ { 
Regex here 
}

Também remova a declaração raiz dentro do location /_links/ block você não precisa, veja pitfalls donginx para mais informações, basicamente servidores root declaration é usado e a localização é correspondida $root/$location

Além disso, conforme sugerido acima, observe a diretiva try_files em vez de if(condition){match}

Ou seja. em vez de:

if (!-f $request_filename) {
    rewrite ^/(.*)$ /index.php?q=$1 last;
}

Uma solução melhor seria:

try_files $uri $uri/ /index.php?q=$uri;

Isso também é mencionado na página wiki de armadilhas do nginx .

    
por 09.11.2014 / 14:59
-1

Evite locais aninhados, se possível. Reescreva o location ^~ /_links/ para o location ^~ /_links/.*\.php e espero que isso seja tudo o que você precisa. E será ainda melhor se você usar apenas um local para * .php, provavelmente movendo algumas de suas reescritas lá.

    
por 09.11.2014 / 13:30

Tags