Usando o Nginx como um proxy reverso para um site PHP usando o Apache com reescrita de URL

0

Estou tentando usar o Nginx como proxy reverso de cache para o Apache rodando um site PHP. É um tipo de trabalho, mas o problema vem ao tentar reescrever a URL para a configuração do Apache, não funciona como eu esperava. Aqui está a configuração.

Eu tenho um site PHP baseado em Joomla rodando em Apache, portas 8080 (http) e 44343 (https) - isso funciona bem e não há nenhum problema aqui. Eu removi o arquivo Joomla .htaccess , pois presumo que o Nginx fará a reescrita para index.php e cuide do cache dos arquivos PHP necessários.

O Joomla reescreve o URL como este example.com/page1 = > example.com/index.php/page1

Eu tenho Nginx ouvindo nas portas 80, 443. Abaixo está a configuração do site

server {
   listen 80;
   listen [::]:80;

   server_name    www.example.com
   return         301 https://$server_name$request_uri;
}
server {
    client_max_body_size 100M;
    autoindex off;

    listen 443 ssl;
    listen [::]:443 ssl;

    server_name www.example.com;
    server_name_in_redirect off;

    ssl_certificate /example.com/ssl.crt;
    ssl_certificate_key /example.com/ssl.key;

    root /var/www/site;

    index index.php index.html index.htm default.html default.htm;

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

    # Reverse Proxy and Proxy Cache Configuration
    location ~ \.php {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass https://127.0.0.1:44343;

        # Cache configuration
        proxy_cache reverse_cache;
        proxy_cache_valid 3s;
        proxy_no_cache $cookie_PHPSESSID;
        proxy_cache_bypass $cookie_PHPSESSID;
        proxy_cache_key "$scheme$host$request_uri";
        add_header X-Cache $upstream_cache_status;
    }

    ...
}

Então, isso carrega o site, mas não importa em qual página eu vá, ele sempre carrega a página inicial. Parece não estar enviando o $uri para index.php conforme esperado na try_files part.

A única maneira de fazer isso funcionar é modificando-o da seguinte maneira:

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

    # Reverse Proxy and Proxy Cache Configuration
    location / {
        ...
    }

Isto apenas envia a requisição inteira para o Apache, e eu tenho que trazer de volta o arquivo .htaccess que permite ao Apache fazer a reescrita.

O site é carregado como esperado, mas o problema é que nenhum arquivo PHP é armazenado em cache (como verificado em / var / cache). Então, o Nginx terá que fazer a reescrita para saber quais arquivos PHP são armazenados em cache para cada pedido.

Alguma ideia de como posso fazer isso?

    
por Wasim 14.10.2016 / 11:46

1 resposta

0

Apenas uma sugestão, mas seu aplicativo upstream também pode exigir a string de consulta junto com o URI original. Você pode tentar modificar seu URI padrão como:

try_files $uri $uri/ /index.php$request_uri;

ou:

try_files $uri $uri/ /index.php$uri$is_args$args;

As variáveis nginx são documentadas aqui .

    
por Richard Smith 14.10.2016 / 13:21