Conversão de Apache para Nginx (Newbie)

3

Eu tenho um Nginx Web Server Setup com PHP e quero mover no Nginx e eu quero converter essas regras de .htaccess para o arquivo nginx.conf:

RewriteRule ^blog(|/)$ /data/core/site/blog.php
RewriteRule ^blog/post(|/)$ /data/core/site/blogpost.php

Até agora, isso é o que eu tenho:

location /blog {
        rewrite ^(.*)$ /data/core/blog.php last;
    }

No entanto, se eu visitar a página ( link ), ele me dá o arquivo para download, eu quero que o servidor do PHP e exibir conteúdo, como eu consertaria isso?

Configuração completa do Nginx: (usando o pacote Winginx no Windows):

server {
    listen 127.0.0.1:80;
    server_name localhost;

    root home/localhost/public_html;

    index index.php;

    log_not_found off;
    #access_log logs/localhost-access.log;

    charset utf-8;

    location ~ /\. { deny all; }
    location = /favicon.ico { }
    location = /robots.txt { }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9054;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include fastcgi_params;
    }

    location /blog {
        rewrite ^(.*)$ /data/core/blog.php last;
    }
}
    
por user3052975 13.12.2014 / 14:11

2 respostas

1

Esta é a solução para minha pergunta, depois de fazer muitas pesquisas sobre problemas, descobri que foi bastante simples:

server {
listen 127.0.0.1:80;
server_name virjox www.virjox;

root home/virjox/public_html;

index index.php;

log_not_found off;
#access_log logs/virjox-access.log;

charset utf-8;

sendfile on;

location ~ /\. { deny all; }
location = /favicon.ico { }
location = /robots.txt { }  
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9054;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    include fastcgi_params;
    rewrite ^/(.*)\.html /$1\.php;
}
   location /blog {
     rewrite ^/blog(|/)$ /data/core/blog.php;
   }
}

e isso funciona perfeitamente.

    
por 14.12.2014 / 11:07
2

Solicitações de processamento

A regra básica a ser lembrada é: o nginx atende a uma solicitação com um local (você pode enfatizar ainda mais: e apenas um local ) .

Leia: link

location correspondência

Leia: location documentação

Com base em sua configuração, o nginx fará a correspondência inicial no local /blog prefix e, em seguida, no local \.php$ regex e, eventualmente, exibirá a solicitação com o último. Com a configuração que você forneceu, o script não deve mais ser baixado como um arquivo raw, mas deve ser enviado ao PHP.

No entanto, isso não significa que sua configuração esteja correta: a solicitação não é atendida pela sua localização /blog , que é inútil no momento.

  1. É uma boa prática geral evitar a filtragem de solicitações com locais de regex, que são baseadas em ordem, o que é ruim (lembre-se do pesadelo da sensibilidade da ordem das diretivas do Apache?). Para filtrar, use os locais de prefixo, que são baseados em correspondência mais longa. Você pode incorporar locais entre si se você precisar de um regex.
  2. Por que não colocar diretamente suas diretivas fastcgi* no local /blog ? Então, em vez de usar a variável $fastcgi_script_name (adivinhada da correspondência location que seriam variantes de /blog aqui), você poderia usar fastcgi_param SCRIPT_FILENAME $document_root/data/core/blog.php . By the way, $fastcgi_script_filename já continha o início / , não há necessidade de adicionar um entre as variáveis
  3. Evite usar redirecionamentos se puder evitá-los. Evite especialmente rewrite ainda mais. Os redirecionamentos simples de usuários (reescrita de URL feita por meio de notificações de redirecionamento enviadas ao cliente com códigos de status HTTP) podem ser feitos com return . O que você fez aqui foi um redirecionamento interno (feito localmente no servidor): seu único uso era alterar o URI usado para o parâmetro SCRIPT_FILENAME .

Você pode usar para começar:

location /blog {
    fastcgi_pass 127.0.0.1:9054;
    fastcgi_param SCRIPT_FILENAME $document_root/data/core/blog.php;
    include fastcgi_params;

    # Useless here since SCRIPT_FILENAME will never be a directory indeed
    fastcgi_index index.php;

    location /blog/post {
        fastcgi_pass 127.0.0.1:9054;
        fastcgi_param SCRIPT_FILENAME $document_root/data/core/blogpost.php;
        include fastcgi_params;
    }
}
    
por 13.12.2014 / 16:49