Nginx Reescrevendo: arquivo PHP dentro da diretiva Location não servido

4

Estou tentando redirecionar um subdiretório para um arquivo php. Em vez de servir o arquivo, ele faz o download, o que significa que ele não o lê como um arquivo php.

Mais exatamente, ele não entra na diretiva fastcgi location ~ \.php$ .

Alguns fatos interessantes:

  • Tudo funciona perfeitamente para o bloco admin , mas não para o bloco login .
  • Quando movo a diretiva location ~ \.php$ acima de login e altero ^~ /login em ~ /login , ela funciona sem a regra de regravação rewrite ^/login/(.+\.php)$ /$1 last; .

Eu li a documentação do Wiki Nginx sobre o tópico, então estou ciente das prioridades nas quais o nginx leu as diretrizes de localização, mas isso não me diz como lidar com este caso! Eu também leio

  • a pergunta semelhante link (sem resposta)
  • link que tentei implementar sem sucesso
  • link que cobre o caso de uma subpasta real (não virtual).

Aqui está a configuração:

server {
 listen  80;

 server_name tyba-one.com *.tyba-one.com;
 root /var/www/tyba/public_html;
 rewrite_log on;
 error_page 404 /404.php;
 client_max_body_size 4M;

 if ($host ~* ^www\.(.*)){
  set $host_without_www $1;
  rewrite ^/(.*)$ $scheme://$host_without_www/$1 permanent;
 }

 location = / {
   rewrite ^/$ /index.php last;
 }

 location ^~ /login {
  rewrite ^(/login)$ $1/ permanent;
  rewrite ^/login/$ /login.php last;
  rewrite ^/login/(.+\.php)$ /$1 last;
 }    

 location ^~ /admin {
  rewrite ^(/admin)$ $1/ permanent;
  rewrite ^/admin/$ /page_builder.php last;
  rewrite ^/admin/(.+\.php)$ /$1 last;
 }

 location ~ \.php$ {
  try_files $uri =404;
  include /opt/nginx/conf/fastcgi_params;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME /var/www/tyba/public_html$fastcgi_script_name;
 }
}

Eu gostaria de entender o que está acontecendo e como lidar com essas situações.

    
por Tristan 08.03.2013 / 13:36

1 resposta

2

O nginx processa apenas um bloco de localização em cada nível de aninhamento e, portanto, /login.php é tratado pelo bloco ^~ /login e não pelo bloco ~ \.php$ . Como você só reescreve as declarações nos blocos de localização, na verdade não precisa dos blocos de localização (desde que as correspondências de reescrita sejam específicas o suficiente, quais são as suas). Basta mover suas instruções de reconfiguração para a raiz do bloco server para que as solicitações para /login e /admin ainda usem o bloco \.php$ location:

rewrite ^/$ /index.php last;
rewrite ^(/login)$ $1/ permanent;
rewrite ^/login/$ /login.php last;
rewrite ^/login/(.+\.php)$ /$1 last;
rewrite ^(/admin)$ $1/ permanent;
rewrite ^/admin/$ /page_builder.php last;
rewrite ^/admin/(.+\.php)$ /$1 last;

location ~ \.php$ {
    ...
}
    
por 12.03.2013 / 01:26

Tags