nginx regra de reescrita para converter segmentos de URL em parâmetros de string de consulta

1

Estou configurando um servidor nginx pela primeira vez e tendo problemas para obter as regras de reescrita corretas para o nginx.

As regras do Apache que usamos foram:

Veja se é um arquivo ou diretório real. Em caso positivo, envie-o e envie todas as solicitações de / a Director.php

DirectoryIndex Director.php

Se o URL tiver um segmento, passe-o como rt

 RewriteRule ^/([a-zA-Z0-9\-\_]+)/$ /Director.php?rt=$1 [L,QSA]

Se o URL tiver dois segmentos, passe-o como rt e action

RewriteRule ^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$ /Director.php?rt=$1&action=$2 [L,QSA]

Meu arquivo de configuração do nginx se parece com:

server {
...

location / {
   try_files $uri $uri/ /index.php;
}    

location ~ \.php$ {
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      include        fastcgi_params;
   }
}

Como obtenho os segmentos de URL em Parâmetros de string de consulta, como nas regras do Apache acima?

UPDATE 1

Tentando a abordagem de Pothi:

# serve static files directly
location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|html)$ {
   access_log off;
   expires 30d;
}


location / {
   try_files $uri $uri/ /Director.php;
   rewrite "^/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1" last;
   rewrite "^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1&action=$2" last;
}


location ~ \.php$ {
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index  index.php;
   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include        fastcgi_params;
}

Isso produz a saída No input file specified. em cada solicitação. Eu não estou claro se o .php location é acionado (e subseqüentemente passado para php) quando uma reescrita em qualquer bloco indica um arquivo .php ou não.

UPDATE 2

Ainda estou confuso sobre como configurar esses blocos de localização e passar os parâmetros.

location /([a-zA-Z0-9\-\_]+)/ {
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index  index.php;
   fastcgi_param  SCRIPT_FILENAME  ${document_root}Director.php?rt=$1{$args};
   include        fastcgi_params;
}

UPDATE 3

Parece que a diretiva raiz estava ausente, o que causou a mensagem No input file specified. . Agora que isso é corrigido, recebo o arquivo de índice como se o URL fosse / em cada solicitação, independentemente do número de segmentos de URL.

Parece que minha expressão regular de localização está sendo ignorada.

Minha configuração atual é:

# This location is ignored:
location /([a-zA-Z0-9\-\_]+)/ {
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index  Director.php;
   set $args $query_string&rt=$1;
   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include        fastcgi_params;
}

location / {
   try_files $uri $uri/ /Director.php;
}

location ~ \.php$ {
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index  Director.php;
   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include        fastcgi_params;
}
    
por Nick 29.09.2013 / 20:04

2 respostas

1

Aviso de isenção de responsabilidade: Nenhum dos itens a seguir foi testado. Por favor use com cautela. Se algo der errado, ative a depuração, conforme mencionado no link .

See if it's a real file or directory, if so, serve it,
then send all requests for / to Director.php

Isso pode ser conseguido com ...

server {
  index Directory.php;
  location / {
    try_files $uri $uri/ /Directory.php;
  }
}

A diretiva index é suficiente para o índice do diretório. Para enviar todos os pedidos para Director.php, o bloco de localização é necessário.

If the URL has one segment, pass it as rt

Você pode tentar o seguinte ...

rewrite "^/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1" last;

Por favor, lembre-se das citações em torno das reescritas. É preferível usar aspas e é necessário em certas condições (mencionadas no link fornecido anteriormente por @jerm).

If the URL has two segments, pass it as rt and action

Você pode tentar o seguinte ...

rewrite "^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1&action=$2" last;

Por favor, note que eu não fiz nada pelo QSA nos exemplos acima. Você pode tentar a variável $args no Nginx para passar a string de consulta existente para a nova string de consulta. Ref: link

Espero que isso ajude a chegar a uma solução completa de trabalho!

    
por 30.09.2013 / 03:46
0

Este é um bom manual sobre a captura de expressões regulares como variáveis em locais nginx

link

    
por 29.09.2013 / 20:16

Tags