У меня есть приложение-катализатор 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.