Подтвердить что ты не робот

Правильное обращение с request_uri в двойном обратном прокси nginx?

Итак, по сути, я запускаю Joomla в контейнере Docker php7-fpm, тогда у меня есть контейнер nginx, где файл joomla.conf определяется следующим образом:

#https://docs.joomla.org/nginx

server {
  listen 8081;

  error_log  /var/log/nginx/error.log;
  access_log /var/log/nginx/access.log;

  server_name php-docker.local;

  root /usr/src/joomla;
  index index.php index.html index.htm default.html default.htm;

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

  # deny running scripts inside writable directories
  location ~* /(images|cache|media|logs|tmp)/.*\.(php|pl|py|jsp|asp|sh|cgi)$ {
    return 403;
    error_page 403 /403_error.html;
  }

  location ~ \.php$ {
    fastcgi_pass  joomla:9000;
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;

    include fastcgi_params;
    #include /etc/nginx/fastcgi.conf;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

И это работает так, как ожидалось... переход к http://: 8081 загружает все правильно.

Теперь 8081 временно отображается в контейнере nginx, что я, по сути, хочу сделать, это настроить обратный прокси-сервер таким образом, что http:///joomla будет конечной конечной точкой.

Для этого я борюсь со следующим файлом conf:

server{

  listen 80;
  server_name _;

  location /joomla/ {
    proxy_pass          http://localhost:8081/;

    proxy_set_header    Referer           $http_referer;
    proxy_set_header    X-Forwarded-Port  $server_port;
    proxy_set_header    X-Forwarded-Proto $http_x_forwarded_proto;
    proxy_set_header    Host              $host;
    proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Host  $host;
  }

}

Что происходит, так это то, что HTML подан правильно, однако ни одно из активов не является. Это связано с тем, что URL-адреса в Joomla генерируются классом JURI, который, как полагают, полагается на $request_uri, который по прибытии в Joomla уже потерян.

https://github.com/joomla/joomla-cms/blob/6ab2a6e9010e7e04c260b9eba17dc76e866dd3e6/libraries/joomla/uri/uri.php#L87

Таким образом, каждая ссылка или ссылка на файл, script или css отображаются следующим образом:

http://localhost/login

http://localhost/images/headers/maple.jpg

Вместо:

http://localhost/joomla/login

http://localhost/joomla/images/headers/maple.jpg

Однако, когда я обращаюсь ко второму набору URL-адресов, я могу получить доступ к ссылке/ресурсу без проблем... но, конечно, еще раз, изображения, шаблоны, js или ссылки не отображаются правильно.

Я предпочитаю не касаться joomla.conf, если что-то не так, как и для site.conf. Я бы хотел только перевести сегменты URI для сопоставления запросов другим приложениям, например:

/joomla -> localhost:8081
/phpbb -> localhost:8082
/someapp -> localhost:8083
4b9b3361

Ответ 1

Самое чистое решение - изменить ваши восходящие потоки, чтобы обеспечить уникальные пути для всех ресурсов.

Как правило, гораздо проще удалить части URL-адреса из восходящего потока (с уникальным префиксом), чем добавлять дополнительные части к не-уникальному. Это связано с тем, что вы всегда можете поймать более длинный URL-адрес и точно знать, к чему он относится, а затем перенаправлять 301 или 302 на более короткую и более сжатую версию.

С другой стороны, столкнувшись с коротким URL-адресом запроса, например /, было бы трудно точно знать, к какому приложению он может обратиться (если вы не заглянете в переменную $http_referer тоже, а затем условно выдать перенаправление на основе того, откуда приходит запрос URL-адреса), или если вы не реализуете какие-то правила спагетти, чтобы определить, какие отдельные URL-адреса относятся к каким приложениям (если вы идете по этому маршруту, директива map.

Кроме того, учтите, что с точки зрения безопасности и при использовании файлов cookie не рекомендуется использовать несколько независимых приложений в одном домене - компромисс в одном приложении может легко привести к нарушениям безопасности во всех остальных.

Ответ 2

Как Rinos, вам нужно настроить $live_site var в configuration.php, как это:

public $live_site = '/joomla/';

Я сделал полный пример в Github, который хорошо работает после редактирования этого файла и использует ваши конфиги.


введите описание изображения здесь


становится:


введите описание изображения здесь

Ответ 3

Вы можете попробовать использовать sub_filter, как он упоминается в этом ответе.

Итак, в вашем случае ваша конфигурация nginx должна выглядеть так:

server{

  listen 80;
  server_name _;

  location /joomla/ {
    proxy_pass          http://localhost:8081/;

    proxy_set_header    Referer           $http_referer;
    proxy_set_header    X-Forwarded-Port  $server_port;
    proxy_set_header    X-Forwarded-Proto $http_x_forwarded_proto;
    proxy_set_header    Host              $host;
    proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Host  $host;
    sub_filter "http://your_server/" "http://your_server/joomla/";
    sub_filter_once off;
  }

}