我有一个节点应用程序作为nginx在子目录中的代理运行。 我遇到了redirect问题,指向应用程序本身的另一部分。 他们总是redirect到根目录而不是代理的子目录。
例:
如果我的应用程序代理位于https://example.com/myApp/
,并且redirect到/admin/
我希望该页面redirect到https://example.com/myApp/admin/
而不是https://example.com/admin/
。
这是我的configuration的相关部分:
location /myApp { rewrite /myApp(.*) $1 break; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-NginX-Proxy true; proxy_pass http://localhost:3030; proxy_redirect http://localhost:3030/ /myApp/; }
我也尝试将proxy_redirect
设置为(^|^http://localhost:3030)/ /myApp/;
这里是这个域的完整的configuration文件:
upstream php-handler { #server 127.0.0.1:9000; server unix:/var/run/php5-fpm.sock; } ## HTTP server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name example.com www.example.com; return 301 https://$server_name$request_uri; } ## HTTPS server { listen 443 ssl; server_name example.com; ssl_certificate /etc/ssl/www.example.com.crt; ssl_certificate_key /etc/ssl/www.example.com.key; add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;"; add_header X-Content-Type-Options nosniff; add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; root /var/www/example.com/; index index.html index.php; client_max_body_size 500M; fastcgi_buffers 64 4k; gzip on; # Website location / { try_files $uri $uri/ =404; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } } # My App location /myApp { rewrite /myApp(.*) $1 break; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-NginX-Proxy true; proxy_pass http://localhost:3030; proxy_redirect http://localhost:3030/ /myApp/; }
好的,我自己想出来了。
TL;博士:
这工作:
proxy_redirect ~(^http://localhost:3030|^)/(.*)$ /myApp/$2;
proxy_redirect / /myApp/;
我猜这是有效的,因为该应用程序重定向到/admin/
而不是http://localhost:3030/admin/
。 但是,这并不能提供我正在寻找的灵活性。
所以当我尝试使用正则表达式时,我最初犯了一些错误:
proxy_redirect (^|^http://localhost:3030)/ /myApp/;
首先 ,如果你打算使用正则表达式,你需要用~
来区分大小写,或者~*
来区分大小写。
其次 ,当你使用正则表达式,它显然取代了完整的路径,而不是只匹配的部分。 例如,如果你要像这样设置一个proxy_redirect:
proxy_redirect ~/(a|b)/ /myApp/;
如果你重定向到/a/some-subdirectory/
重写将导致/myApp/
not /myApp/some-subdirectory/
。 要做到这一点,你需要捕获路径的末尾,并将其插入重写的末尾,如下所示:
proxy_rewrite ~/(a|b)/(.*)$ /myApp/$2;
注意 :我无法在文档中找到有关此行为的任何信息。 我只是把这个基于我自己的试验和错误的结果。
所以我最后的proxy_redirect看起来像这样:
proxy_redirect ~(^http://localhost:3030|^)/(.*)$ /myApp/$2;
从我的角度来看,您应该尝试在服务器块中的listen指令,将其定义为默认值(来源: http : //nginx.org/en/docs/http/request_processing.html ):
listen 80 default_server;
下面的声明意味着一个无效的服务器名称(来源: http : //nginx.org/en/docs/http/server_names.html )(所以它不会与任何有效的域相交):
server_name _;
要解决你的问题,确保你有一个服务器端口监听(端口)和server_name(虚拟主机) – 这将首先触发,当你从“更精确到不太精确”,当你做虚拟主机名称匹配在Nginx :
listn 80 server_name your-domain-name.com;