如何始终重定向到 Nginx Docker 中的 index.html?

Posted

技术标签:

【中文标题】如何始终重定向到 Nginx Docker 中的 index.html?【英文标题】:How to always redirect to index.html in Nginx Docker? 【发布时间】:2020-04-24 12:39:37 【问题描述】:

我正在使用 Docker 的 nginx:1.16.0-alpine 图像作为服务反应应用程序(之前构建的),并且我想在任何情况下都重定向到 index.html 页面(在获得什么 URL 时)

nginx.conf文件有以下内容:

user  nginx; worker_processes  auto;

error_log  /var/log/nginx/error.log warn; pid       
/var/run/nginx.pid;

events 
    worker_connections  1024; 

http 
    include       /etc/nginx/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"';

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

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    server 
        location / 
            try_files $uri $uri/ /index.html;
        

        location ~ ^/$ 
            rewrite  ^.*$  /index.html  last;
        
    

其实server部分是加的,其他行都是默认的!

Dockerfile内容如下:

FROM nginx:1.16.0-alpine

COPY ./build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

为了确保在从图像构建容器并进入其中的外壳之后,文件/etc/nginx/nginx.conf 具有上述内容。

但问题是:当我浏览 url http://localhost:3000/login(例如)时,它不会重定向到 http://localhost:3000/index.html。它显示:

404 未找到 nginx/1.16.0

(Docker 容器在输出端口 3000 和本地端口 80 上运行)

有谁知道为什么它不起作用!? (我也搜索了类似的方法,但没有成功!)

更新: 页面React-router and nginx 没有解决问题。

【问题讨论】:

@emix,请查看 location 部分,该部分显示任何 URL 重定向到 /index.html,但不起作用 好的,内容隐藏在移动设备中。您的问题存在严重的格式问题。这是一个代码,不知道你为什么把它放在引号里。 这能回答你的问题吗? React-router and nginx @yurloc,很遗憾没有! 【参考方案1】:

评论下面一行

# include /etc/nginx/conf.d/*.conf;

为什么?由于线路

include /etc/nginx/conf.d/*.conf;

加载 default.conf 并忽略您的服务器配置。

另外,你需要在你的服务器中包含根信息(之前是由default.conf提供的


如何重现

将以下2个文件放在同一个文件夹下执行

docker build -t test . && docker run --rm -p 8080:80 test

Dockerfile

FROM nginx:1.16.0-alpine

# COPY ./build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

nginx.conf

user nginx; worker_processes auto;

error_log /var/log/nginx/error.log warn; pid
/var/run/nginx.pid;

events  worker_connections 1024; 

http  include /etc/nginx/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"';

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

sendfile        on;
#tcp_nopush     on;

keepalive_timeout  65;

#gzip  on;

#include /etc/nginx/conf.d/*.conf;

    server 
    location / 
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    

    location ~ ^/$ 
        rewrite  ^.*$  /index.html  last;
    
    listen       80;
    server_name  localhost;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html 
        root   /usr/share/nginx/html;
    


【讨论】:

感谢您的回复,但它不起作用。错误消息更改为“500 Internal Server Error - nginx/1.16.0” 这似乎是正确的答案 - 包括默认服务器配置肯定会与您添加的服务器配置混淆。你应该做一个或另一个 - 更典型的是将你的服务器配置添加到conf.d/default.conf。无论如何,如果您现在收到500,您需要检查日志并找出原因。 为了避免500,在server 指令下添加root /usr/share/nginx/html;(取自更高级的配置:gkedge.gitbooks.io/react-router-in-the-real/content/nginx.html)。 @Don'tPanic, 这是去localhost:3000/login:2020/01/07 11:49:33 [error] 6#6: *2 rewrite or internal redirection cycle while internally redirecting to "/index.html", client: 172.17.0.1, server: , request: "GET /login HTTP/1.1", host: "localhost:3000"172.17.0.1 - - [07/Jan/2020:11:49:33 +0000] "GET /login HTTP/1.1" 500 579 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36" "-"后的日志 @SiyavashHamdi,太棒了!我建议您将服务器定义放入专用文件中,将其复制到 /etc/nginx/conf.d/ 中作为 default.conf 并保留原来的 nginx.conf 原样。例如不要将nginx.conf 复制到您的容器中,而是将default.conf 复制到仅包含服务器部分的/etc/nginx/conf.d/ 中。如果您需要帮助,请告诉我。

以上是关于如何始终重定向到 Nginx Docker 中的 index.html?的主要内容,如果未能解决你的问题,请参考以下文章

容器中的 Node.js 始终获取 docker0 ip

Dockerized Nginx将不同的子域重定向到同一页面

Docker + Gunicorn + Nginx + Django:将非 www 重定向到 AWS Route 53 上的 www

Plesk:如何将域端口 80 和 443 重定向到我的 Docker 容器?

Nginx docker代理容器没有重定向?

如何将所有 Angular 请求重定向到 Nginx 中的 index.html