如何使nginx代理停止redirect到根?

我有一个节点应用程序作为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/ 。 但是,这并不能提供我正在寻找的灵活性。


第二个选项:

使用RegExp

所以当我尝试使用正则表达式时,我最初犯了一些错误:

 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;