我有一个节点应用程序作为子目录中nginx的代理运行。我遇到了重定向问题,指向应用程序本身的不同部分。它们总是重定向到根而不是代理的子目录。
实施例
如果我的应用代理位于https://example.com/myApp/
并且重定向到/admin/
,我希望该网页重定向到https://example.com/myApp/admin/
而不是https://example.com/admin/
。
以下是我配置的相关部分:
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/;
以下是此域的完整配置文件:
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/;
}
答案 0 :(得分:4)
好吧,我自己想出来了。
<强> TL; DR:强>
这有效:
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/
而不是/myApp/some-subdirectory/
。为了完成这项工作,您需要捕获路径的末尾并将其插入到重写的末尾,如下所示:
proxy_rewrite ~/(a|b)/(.*)$ /myApp/$2;
注意 :我在文档中找不到有关此行为的任何信息。我只是基于我自己的试验和错误的结果。
所以我的最终proxy_redirect看起来像这样:
proxy_redirect ~(^http://localhost:3030|^)/(.*)$ /myApp/$2;
答案 1 :(得分:-3)
从我的角度来看,您应该尝试在服务器块中使用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 _;
要解决您的问题,请确保您拥有一个带有listen(端口)和server_name(虚拟主机)的服务器块 - 当您执行虚拟主机名时,将首先触发此一个,从“更精确到更精确”在nginx中匹配:
Listen 80
Server_name your-domain-name.com;