问题
如上所示(1)很奇怪,通过nginx代理后可以正常访问geoserver的管理页面,什么都现实正常,但是一点点击某些按钮发送请求时候就报错,比如:服务器状态—>载入被配置就报错400(如下图)。(2)是在登录账号时候会向http发送请求,有时候就容易造成无法登录的情况。
分析
(1)这个是真的一个很离谱情况,首先排查了nginx配置,没有问题;后来觉得是跨域问题没弄好,实际上已经配置过了的(参考官网:开启cors),且没有问题,但是我还是死磕,各种排错,弄了一下午太头大了!
(2)第二问题影响不大,主要看着很烦,有时候会出现明明密码正确但是无法登录的情况。
location /geoserver {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_pass http://xxx.xxx.xxx.xxx:8080/geoserver;
}
解决
(1)主要还是参考了大佬(StackOverflow)和官网(https://docs.geoserver.org/latest/en/user/security/webadmin/csrf.html)的解决方法,核心问题还是geoserver自动给你开了CRSF保护,所以需要给一个白名单或者直接关闭这个保护就好了,主要就是给根目录下的:.\webapps\geoserver\WEB-INF\web.xml中增加一个配置,这个原先文件没有,需要自己加(value中填写自己的域名)。
<context-param>
<param-name>GEOSERVER_CSRF_WHITELIST</param-name>
<param-value>domain.com</param-value>
</context-param>
(2)第二个问题可以从两方面解决,一方面是nginx增加一个重定向,将80端口内容重定向到443端口,另一方面在geoserver网页中的全局配置中增加Proxy Base URL,如:“https://example.com/geoserver”,同时勾选“Use headers for Proxy URL”选项(这个过程如果没有提交,就用ip地址登录并提交,修改后记得刷新配置)
其他
对了,geoserver如果基于jdk17,在点击部分按钮时候会报错500(如下图):HTTP ERROR 500 javax.servlet.ServletException: org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class java.awt.GraphicsEnvironment$LocalGE。这个主要还是与jdk的部分不兼容,参考官网内容把marlin.jar删除就好了。
感受
太多坑了,想念arcgis server了