Использование Nginx в качестве обратного прокси для сайта PHP с использованием Apache с перезаписью URL

Я пытаюсь использовать Nginx в качестве обратного прокси-сервера для Apache, работающего на PHP-сайте. Это вроде работает, но проблема возникает при попытке переписать URL в настройке Apache, это не работает, как я бы надеялся. Вот настройки.

У меня есть PHP-сайт на основе Joomla, работающий на Apache, порты 8080 (http) и 44343 (https) - это работает нормально, и здесь нет никаких проблем. Я удалил Joomla .htaccess файл, как я предполагаю, Nginx сделает переписывание в index.php сам и позаботься о кешировании необходимых PHP файлов.

Joomla переписывает URL, как это example.com/page1 => example.com/index.php/page1

У меня Nginx прослушивает порты 80, 443. Ниже находится конфиг сайта

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;
    }

    ...
}

Таким образом, это загружает сайт, но независимо от того, на какую страницу я захожу, всегда загружается домашняя страница. Похоже, это не отправка $uri в index.php как и ожидалось в try_files часть.

Единственный способ сделать эту работу - изменить ее следующим образом:

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

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

Это просто отправляет весь запрос в Apache, и я должен вернуть .htaccess файл, который позволяет Apache переписывать.

Сайт загружается, как и ожидалось, но проблема в том, что файлы PHP не кэшируются (как проверено в /var/cache). Поэтому Nginx придется переписать, чтобы узнать, какие PHP-файлы кэшируются для какого запроса.

Есть идеи, как я могу это сделать?

1 ответ

Просто предложение, но ваше апстримовое приложение может также потребовать строку запроса вместе с исходным URI. Вы можете попробовать изменить ваш URI по умолчанию как:

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

или же:

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

nginx переменные документированы здесь.

Другие вопросы по тегам