如何始终重定向到 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?的主要内容,如果未能解决你的问题,请参考以下文章
Dockerized Nginx将不同的子域重定向到同一页面
Docker + Gunicorn + Nginx + Django:将非 www 重定向到 AWS Route 53 上的 www