简体   繁体   中英

nginx redirect to wrong website

I have config two node apps running behind nginx. nginx is used as revers proxy, one domain redirects to wrong app on it default url,

app1 port 3000 domain http://www.site1.com and https://www.site1.com

app2 port 3001 domain http://www.site2.com

http://www.site1.com and https://www.site1.com works fine and serves app1

but when http://www.site2.com it redirect to https://www.site2.com and servers app1

but when http://www.site2.com/someurl is requested it servers app2

here is nginx config

site1

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name www.site1.com;
        return 301 https://$server_name$request_uri;
}
server {

  listen 443 ssl;

  server_name www.site.com;
  ssl on;
  ssl_certificate /certificate.crt;
  ssl_certificate_key /psa.rsa;
  location / {
      proxy_pass http://localhost:3000;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection 'upgrade';
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
      proxy_cookie_path / "/; HTTPOnly; Secure";
  }
}

site1 conf

server {
        listen 80;
        server_name www.site2.com;
        location / {
                proxy_pass http://localhost:3001;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection ‘upgrade’;
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }
}

default conf

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
#
# Generally, you will want to move this file somewhere, and start with a clean
# file but keep this around for reference. Or just disable in sites-enabled.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
server {
        #listen 80 default_server;
        #listen [::]:80 default_server;

        # SSL configuration
        #
        #listen 443 ssl default_server;
        #listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #       include snippets/fastcgi-php.conf;
        #
        #       # With php7.0-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
        #       # With php7.0-fpm:
        #       fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #       deny all;
        #}
}


# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#       listen 80;
#       listen [::]:80;
#
#       server_name example.com;
#
#       root /var/www/example.com;
#       index index.html;
#
#       location / {
#               try_files $uri $uri/ =404;
    #       }
#}

you only have one https server conf and it proxies all request to app1(port 3000), it will not serve app2 on https for you.

proxy to app2 or app1 conditionally by checking the Host header requested, eg:

server {
    listen 443 ssl;
    ...
    location / {
        if ($host = 'www.site1.com') {
            proxy_pass http://localhost:3000;
        }
        if ($host = 'www.site2.com') {
            proxy_pass http://localhost:3001;
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM