Como posso definir o SCRIPT_NAME ao usar proxy_pass com nginx

1

Eu tenho um aplicativo de catalisador perl que estou montando em um URL específico (vs montagem em um subdomínio) e estou tendo problemas para definir SCRIPT_NAME na solicitação para o back-end. Isso afeta os URLs gerados pelo aplicativo. Ele precisa saber onde está montado para poder gerar as URLs corretamente.

Então minha cadeia é:

request = > [nginx, proxy_pass] = > [starman: 5000] = > [perl_app]

Quando o proxy_pass envia o pedido para o starman, estou esperando que ele defina SCRIPT_NAME . Se eu estivesse usando fastcgi, faria fastcgi_param SCRIPT_NAME something ou usaria fastcgi_split_path_info . Neste ponto, estou pronto para virar para o fastcgi, mas sou teimoso e quero descobrir se isso é possível. Eu tentei configurar o fastcgi_params de qualquer maneira só para ver se isso afetaria o SCRIPT_NAME enviado com o proxy_pass, mas não tanto quanto eu posso dizer.

minha configuração do servidor 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;
}

Portanto, o aplicativo está em example.com/ff e o deve redirecionar para example.com/ff/login se você tentar ir para example.com/ff/home sem estar logado. Em vez disso, quando você faz uma solicitação para example.com/ff/home PATH_INFO é definido como / home (conforme esperado) e SCRIPT_NAME é '', portanto, o aplicativo gera um redirecionamento para example.com/home em vez de example.com/ff/home

Até onde eu encontrei, minhas únicas soluções são:

  • use fastcgi
  • faça algo no aplicativo catalisador para informar onde ele está montado (como ler um cabeçalho de solicitação http para saber onde ele está montado e, em seguida, o código de geração uri pode criar o caminho correto)

Obrigado por qualquer ideia.

    
por mikew 12.10.2014 / 04:57

1 resposta

0

A carga não está no nginx. Proxy ou FastCGI passam informações sobre um soquete, o que é interpretado. FastCGI não é muito diferente, exceto que há um contrato que especifica como as informações que devem ser colocadas no aplicativo CGI devem ser transmitidas e processadas. O SCRIPT_NAME é um deles.

Se você deseja manter o proxy, é necessário ensinar starman hoe a interpretar determinados cabeçalhos e dizer ao nginx para defini-los usando proxy_set_header.

    
por 13.10.2014 / 08:32