使用Docker部署nginx出现url重定向导致端口消失问题

        前两天在部署一个web网页的时候,因为原本docker中的nginx已经部署过了其他的web网页了,现在需要用nginx做一个最基本的根据访问url进行返回不同的index.html首页,所以我就将原本的docker挂载的html文件目录中直接添加了两个文件夹用来分别对应两个url的网站首页,原目录结构如下:(由于特殊原因实际网页源码文件名特殊,所以就拿个演示目录截图,结构类似)

·于是根据这个目录结构,我就快乐的修改起nginx.conf的server块的内容如下:

·再重启一下nginx对应的容器,然后打开浏览器输入http://xxx:9000/test01/和http://xxx:9000/test02/

成功访问对应的页面,正准备快乐的交差,人家突然告诉我访问的路径能不能改一改,不想在最后面加那个/,我也没多想,就直接试了一下不加斜杠访问,发现会报404错误,没找到对应的资源???

        然后我就直接开搜相关的问题,发现nginx有个重定向的机制是这样的,如果你最后没有加那个斜杠,它默认认为你要搜索的是http://xxx:9000/下的名为test01的文件,但是这个test01显然是一个文件夹,nginx在搜不到后就会给浏览器返回一个301重定向,告诉浏览器重新发送请求,加上最后的斜线试试。然后我就打开浏览器的调试控制台看网络的内容,刷新页面后的确收到了一个301的重定向,按正常道理来讲是没有问题的,并且可以被重定向到加斜杠的路径,但是我的浏览器收到的重定向url居然没有端口号,也就是说在重定向后nginx认为浏览器应该访问的端口应该是默认的80,而我的服务器宿主机的80端口由于特殊原因被占用了,所以用docker将宿主机和容器的9000端口做了映射。然后我重新在网络上查找有没有和我一样遇到相关问题的人,然后找到了一堆方法,什么禁止相对路径重写啊啥的,似乎都解决不了。然后突然想到了nginx的一个rewrite指令可以重写url,既然已经通过/test01匹配到了对应的location块,那么是不是可以在这个location块中直接吧url强制重写在后面加一个/来解决呢?

于是便有了第一个location块用来重写匹配的不带斜杠的url,问题解决!

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是使用 Docker 部署 Nginx使用 Nginx 部署项目的步骤: 1. 首先,需要安装 Docker,可以参考官网的安装教程进行安装。 2. 创建一个用于存放 Nginx 配置文件和项目文件的目录,比如 /home/nginx。 3. 在该目录下创建一个名为 nginx.conf 的 Nginx 配置文件,可以参考以下示例进行编写: ``` worker_processes 1; events { worker_connections 1024; } http { server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; } location /api/ { proxy_pass http://backend:8000/; } } } ``` 上述配置文件中,Nginx 监听本地 80 端口,将访问根目录的请求转发到 /usr/share/nginx/html 目录下的 index.html 文件,将以 /api/ 开头的请求转发到名为 backend 的 Docker 容器中的 8000 端口。 4. 在该目录下创建一个名为 Dockerfile 的文件,用于构建自定义的 Nginx 镜像,可以参考以下示例进行编写: ``` FROM nginx COPY nginx.conf /etc/nginx/nginx.conf COPY dist/ /usr/share/nginx/html/ ``` 上述 Dockerfile 文件中,使用 nginx 作为基础镜像,将本地的 nginx.conf 文件复制到容器中的 /etc/nginx/nginx.conf 目录下,将本地的项目文件复制到容器中的 /usr/share/nginx/html/ 目录下。 5. 使用以下命令构建并运行 Nginx 容器: ``` docker build -t my-nginx . docker run --name my-nginx -p 80:80 --link backend my-nginx ``` 上述命令中,首先使用 docker build 命令构建名为 my-nginx 的自定义 Nginx 镜像,然后使用 docker run 命令启动该镜像对应的容器,将本地的 80 端口映射到容器的 80 端口,并连接名为 backend 的后端容器。 6. 至此,使用 Docker 部署 Nginx使用 Nginx 部署项目的过程已完成。可以通过浏览器访问 http://localhost 来查看部署的项目。如果该项目中有需要通过 /api/ 访问的后端服务,可以在后端容器中启动该服务,并将其命名为 backend,以便 Nginx 容器能够连接到该服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值