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

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

Таким образом, моя цепочка:

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

Когда proxy_pass отправит запрос астрологу, я ожидаю, что это установит 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 установлен на / домой (как ожидалось) и SCRIPT_NAME '', таким образом, приложение генерирует перенаправление к example.com/home вместо example.com/ff/home

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

  • используйте fastcgi
  • сделайте что-то в приложении катализатора для уведомления его, где это смонтировано (как чтение заголовок запроса HTTP для знания, где это смонтировано, и затем код поколения uri может создать надлежащий путь),

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

1
задан 12 October 2014 в 05:57
1 ответ

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

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

0
ответ дан 4 December 2019 в 08:27

Теги

Похожие вопросы