nginx背后的Spring启动应用程序重定向不正确

时间:2018-04-14 09:39:38

标签: spring-boot nginx

我正在尝试使用我在Running a Spring Boot app behind nginx找到的配置文件在nginx(在开发机器上)后面运行我的spring启动应用程序。然而Firefox表示它没有正确重定向,并且javascript控制台中的Network选项卡确认了许多302重定向。

这是我正在使用的nginx.conf:

http {
include       mime.types;
default_type  application/octet-stream;

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

keepalive_timeout  65;

upstream tomcat {
    server localhost:8080;
}

server {
    listen       80;
    server_name  localhost;

    access_log  /var/log/nginx/localhost.access.log  main;

    location / {
            proxy_pass              $scheme://tomcat/$request_uri;
            proxy_redirect          off;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
    }
}

实际上,提到的日志文件有很多这样的行:

127.0.0.1 - - [14/Apr/2018:11:25:38 +0200] "GET /login HTTP/1.1" 302 0 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0" "-"

它正在重定向到/ login,实际应该是:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{
    @Autowired private AuthService authService;

    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http
            .authorizeRequests()
            .anyRequest().authenticated()
        .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
        .and()
            .logout()
            .permitAll();

        http.csrf().disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception
    {
        auth.userDetailsService(authService);
    }
}

有人可以告诉我为什么对/ login的调用似乎被重定向到/ login而不是在该网址上撤回页面?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您应该使用:

proxy_pass http://tomcat;

用于在端口8080上连接到Tomcat的协议方案是固定的,应该是httphttps。此$scheme块的server恰好是http,但没有充分理由将该变量用于代理连接。

默认情况下,nginx会将请求的URI透明地传递给代理连接,因此除非必须更改某些内容,否则无需在proxy_pass语句中提供URI。

当存在URL编码字符时(例如在登录序列中将登录页面作为参数传递),使用$request_uri会有问题,因为它是原始请求且字符尚未解码。 proxy_pass指令可能会编码已编码的字符,将请求变为垃圾。

有关详情,请参阅this document