URL 跳转携带原路径
在使用我的笔记中,发现登录之后,无法跳转到登录前要到达的页面。
首先,检查 Nginx 配置,查看是否配置了携带登录前的 URL 路径。查看之后,发现没有配置,现在将其配置好,配置如下:
location @error401{
return 302 https://$host/login/?url=https://$host$request_uri;
}
配置好后,继续测试,发现登录后,还是调整到首页,并没有调整到登录前的页面。检查登录应用,发现登录应用没有取 URL 参数,所以直接跳转到根路径。
将应用配置好,取 URL 参数,当 URL 参数不为空时,跳转到该 URL 路径。
url := c.Query("url")
if url != "" {
c.Redirect(http.StatusFound, url)
} else {
c.Redirect(http.StatusFound, "/")
}
将应用打包,发布到服务器继续测试,还是失败,看日志,浏览器请求时是携带 URL 参数的。
GET /login/?url=https://www.91demo.top/zh-cn/private/project/visit/ch1.html
一度对人生产生怀疑,为啥我的不可以呢?我是参考网上教程配置的,网上教程使用 Python 举例,我这里使用 Go 实现,原理上应该是可行的啊。
经过多次细读对比,发现自己的 GET 请求路径是/login/,POST 请求路径是/api/doLogin,而网上教程 GET 和 POST 请求都是/login/,将自己的应该重新调整,无论 GET 请求还是 POST 请求都调整为/login 路径。当将应用推到服务器时,发现浏览器上显示跳转次数过多。排除一番后,将应用路径调整为/login/,Nginx 配置文件也进行了修改,修改为如下配置:
location /login/ {
proxy_pass http://127.0.0.1:9982/login/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
原来的配置如下:
location /login/ {
proxy_pass http://127.0.0.1:9982/login;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
可以看到,在 login 后添加了/,无法解释为什么,反正现在是可以正常访问网站了。然后继续测试,发现登录后还是调整到首页。
经过对比,发现登录页面,网上教程写法如下:
<form method="post">
我的页面写法如下:
<form method="post" action="/login/">
和教程调整一致,重新启动服务,继续测试。这次成功了。
仔细查看日志,发现了问题。
/login/ {"status": 302, "methed": "POST", "path": "/login/", "query": ""
调整后,日志如下:
/login/ {"status": 302, "methed": "POST", "path": "/login/", "query": "url=https://www.91demo.top/zh-cn/private/index.html"
哎,不容易。终于搞定了。