想要实现访问 http://aaa.com/abc 实现访问 http://aaa.com:8080 的效果。 但是浏览器上显示 http://aaa.com/abc nginx 的配置文件怎么写
location /abc/ { proxy_pass http://aaa.com:8080 } 不行啊?
1
Elissa 2022-03-22 16:55:40 +08:00
location /abc
最后别带 /试试,或者访问的时候也带着 /,总之访问时和配置文件保持完全一致 |
2
hdp5252 OP |
3
linfx7 2022-03-22 17:22:34 +08:00
getenforce 看看,selinux 会拦截 nginx 到本机其他端口的请求
|
4
dier 2022-03-22 17:31:59 +08:00 1
location /abc/ {
... proxy_pass http://localhost:8080/; ... } |
5
dier 2022-03-22 17:37:48 +08:00 1
解释一下我上面的配置,浏览器访问 abc.com/abc/index.html ,nginx 代理的 URL 是 localhost:8080/index.html 。理论上就是你要的效果,但是这种配法可能会有部分静态资源显示 404 。
|
6
zxw567 2022-03-22 17:49:58 +08:00
|
7
hdp5252 OP @dier 感谢,可以跳转到 8080 端口,但是输入密码后还是无法显示网页
8080 端口是阿里云的 webdav 。 |
8
hdp5252 OP |
9
adoal 2022-03-22 19:04:05 +08:00 1
反向代理(不要把这个称为转跳,301/302 那种才是转跳)其实是一件挺复杂的事。前面的代理服务器的配置就已经挺麻烦了,有时候仅仅配对前面,后面的业务系统没有“意识到”自己处在反代后面从而做出一些行为调整,也会导致反代的效果不太对。
Nginx 的`proxy_pass`后面参数,写完主机名和端口号,如果不跟路径就结束,那它的意思其实是把传进来的 URI 的全路径直接附加到指定的主机后面,并不会剥掉`location`里指定的前缀`/abc`,所以 8080 上的业务系统就找不到了,所以需要按#4 的写法。 但是这样写了之后,后面的业务系统仍然是按照自己服务在根路径下来运行的,也就是说生成的页面内绝对 URL 并不会多一个`/abc`,这样对前端浏览器(或走 HTTP 协议的其它客户端)来说就错掉了。所以一个业务系统要运行在反代后面,其实是要跟前面的反代约定好,如何让业务系统知道自己要服务的子路径等信息。有的 web 框架会通过特定的 HTTP header 来做这事,有的则提供了通过配置参数来指定的方法,如果什么都没有,那就得在业务系统里自己实现这个逻辑了。 看了一眼你用的这个软件……注意到有个参数:`--root <ROOT>`,看起来像你需要的东西。 |
10
yin1999 2022-03-22 19:26:40 +08:00 1
|
11
kokutou 2022-03-22 21:11:12 +08:00
看看 nginx 的日志你就知道了
实际请求的路径哪里不对改哪里... |
12
TenRice 2022-03-22 22:18:42 +08:00 2
location /abc/ {
proxy_pass http://127.0.0.1:8080/; sub_filter 'href="/' 'href="/abc/'; sub_filter_once off; sub_filter_types *; } |
13
TenRice 2022-03-22 22:23:21 +08:00 1
@TenRice location 和 proxy_pass 结尾都需要有 / 。配置 sub_filter 后可以让文件夹可以正常打开,sub_filter 需要在 Nginx 编译时手动指定 --with-http_sub_module 模块。
|
15
dier 2022-03-23 11:13:06 +08:00 1
这种反代我一般都是建议 nginx 单独配置一个 server ,用一个独立的二级域名,反代到 location / 不要加额外的路径,减少问题,方便排错。
server { ... server_name webdav.domain.com; ... location / { proxy_pass http://ip:port/; } } |