Nginx tratando urls PHP antigos como Arquivos

2

É muito difícil tentar descobrir isso. Eu mudei meu site de outra plataforma para o Joomla e agora o Nginx é incapaz de lidar com URLs antigos.

Meus URLs antigos eram assim:

example.com/home.php
example.com/contact-us.php

Meus novos URLs do Joomla SEF são assim:

example.com/home
example.com/contact-us

Eu tenho a seguinte configuração do Nginx conforme o guia do Joomla:

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

 # Process PHP
 location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.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;
 }

Eu quero que o Nginx passe esses URLs antigos para o Joomla para lidar com isso. Agora, o que está acontecendo é que o Nginx está tratando esses urls antigos como arquivos php e depois me mostrando esse erro No input file specified. . Então eu mudei o try_files dentro do bloco php para try_files $uri /index.php?$args; , então minha configuração do Nginx ficou assim:

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

 # Process PHP
 location ~ \.php$ {
            try_files       $uri /index.php?$args;
            fastcgi_split_path_info ^(.+\.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 é válido? Isso causaria um loop infinito em alguns casos? Este é o caminho certo para fazer isso? Eu não encontrei nenhuma solução semelhante a esta. Alguém pode me guiar por favor?

    
por Neel 09.01.2015 / 14:47

1 resposta

3

location / nunca é usado

O problema que você tem está relacionado à precedência de local (ênfase adicionada).

nginx first searches for the most specific prefix location given by literal strings regardless of the listed order. [...] Then nginx checks locations given by regular expression in the order listed in the configuration file. The first matching expression stops the search and nginx will use this location. If no regular expression matches a request, then nginx uses the most specific prefix location found earlier.

Assim, este bloco de localização:

location ~ \.php$ {
    try_files $uri =404; # <-

Corresponde a esta solicitação:

example.com/home.php

e nenhum outro bloco de localização é relevante.

Como você já percebeu, isso significa que o nginx tentará encontrar e servir home.php , resultando em um 404.

Use um @location para o arquivo index.php principal

Normalmente, o único arquivo php de relevância é index.php , você pode usá-lo da seguinte forma:

try_files $uri $uri/ @joomla;

location @joomla {
    include fastcgi_params;
    fastcgi_pass    unix:/var/run/php5-fpm.sock;
    fastcgi_param   SCRIPT_FILENAME     $document_root/index.php;
    fastcgi_param   SCRIPT_NAME         $document_root/index.php;
    fastcgi_param   DOCUMENT_URI        /index.php;
    fastcgi_index   index.php;
}

Use outro bloco de localização para solicitações * .php

Além de um front controller, o joomla permite / espera que outros arquivos php sejam acessados diretamente, como /administrator/index.php . Para permitir o acesso a eles sem tentar processar arquivos php ausentes:

location ~ \.php$ {
    try_files $uri @joomla;

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

Isso permitirá acesso direto a outros arquivos php (o que normalmente não é bom ...) voltando a usar /index.php , via @joomla location, para qualquer requisição de arquivo php que não existe.

Observe que a configuração acima também é na documentação .

    
por 09.01.2015 / 15:14