Назад | Перейти на главную страницу

Как я могу установить SCRIPT_NAME при использовании proxy_pass с nginx

У меня есть приложение-катализатор Perl, которое я устанавливаю на определенный URL-адрес (а не на поддомен), и у меня возникают проблемы с настройкой SCRIPT_NAME в запросе к бэкэнду. Это влияет на URL-адреса, создаваемые приложением. Ему нужно знать, где он установлен, чтобы он мог правильно генерировать URL-адреса.

Итак, моя цепочка:

запрос => [nginx, proxy_pass] => [starman: 5000] => [perl_app]

Когда proxy_pass отправляет запрос starman, я ожидаю, что он установит SCRIPT_NAME. Если бы я использовал fastcgi, я бы сделал fastcgi_param SCRIPT_NAME something или используйте fastcgi_split_path_info. На данный момент я готов просто перейти на fastcgi, но я упрям ​​и хочу выяснить, возможно ли это. Я все равно попытался установить fastcgi_params, чтобы посмотреть, не повлияет ли это на SCRIPT_NAME отправлено с proxy_pass, но, насколько я могу судить, это не так.

моя конфигурация сервера nginx:

server {
  #listen   80; ## listen for ipv4; this line is default and implied
  #listen   [::]:80 default ipv6only=on; ## listen for ipv6

  root /usr/share/nginx/default;
  index index.html;

  server_name www.example.com example.com;
  listen 80 default_server;
  listen 443 ssl;
  ssl_certificate     certs/cert.pem;
  ssl_certificate_key certs/key.pem;
  ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers         HIGH:!aNULL:!MD5;

  location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to index.html
    try_files $uri $uri/ =404;
  }

  location /ff/ {
    if ( $https = "off" ) {
      return 302 https://$server_name$request_uri;
    }

    #fastcgi_split_path_info (.*)(.*);
    #include fastcgi_params;
    #fastcgi_param PATH_INFO /blah;
    #fastcgi_param SCRIPT_NAME /test;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Port $server_port;
    #fastcgi_pass localhost:5000;
    proxy_pass  http://localhost:5000/;
  }

  error_page 404 /errors/404.html;
  error_page 500 502 503 504 /errors/50x.html;
}

Итак, приложение включено example.com/ff и должен перенаправить на example.com/ff/login если вы попытаетесь пойти в example.com/ff/home без входа в систему. Вместо этого, когда вы делаете запрос example.com/ff/home PATH_INFO установлен в / home (как и ожидалось) и SCRIPT_NAME есть '', поэтому приложение генерирует перенаправление на example.com/home вместо того example.com/ff/home

Насколько я понял, мои единственные решения:

Спасибо за понимание.

Бремя не лежит на nginx. Прокси или FastCGI передают информацию через сокет, которая интерпретируется. FastCGI не сильно отличается, за исключением контракта, который определяет, как информация, которая должна быть помещена в приложение CGI, должна передаваться и обрабатываться. SCRIPT_NAME - один из них.

Если вы хотите использовать прокси-сервер, вам нужно научить starman hoe интерпретировать определенные заголовки и указать nginx, чтобы он устанавливал их с помощью proxy_set_header.