我制作了一个非常简单的服务器来测试带有文件夹的 URL 在 nginx 中的行为。Nginx 在 docker 中运行(nginx:最新镜像)。Nginx 运行用户nginx
(默认设置在 中/etc/nginx/nginx.conf
)。
server {
server_name example.com;
location /test/ {
root /var/www/test;
index index.html;
}
}
以及这个结构:
/var/www
└── test
└── index.html
cat /var/www/test/index.html
Test
ls -l /var/ | grep www
drwxr-xr-x 3 root root 4096 Jan 15 23:33 www
ls -l /var/www/test/
-rw-r--r-- 1 root root 7 Jan 15 21:08 index.html
现在我有这个问题:
curl http://example.com/test/
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>
curl http://example.com/test
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>
我希望在访问http://example.com/test
或时看到“测试” http://example.com/test/
。我做错了什么?
答案1
两件不同的事情正在发生。
nginx 在处理请求时将请求 URI 附加到指令路径的末尾root
。 在您的例子中,URL 为http://example.com/test
,规范化 URI 为/test
,您的root
为/var/www/test
。
index.html
这会让 nginx在 中寻找/var/www/test/test/index.html
。
要创建 nginx 服务器/var/www/test/index.html
,您需要使用:
root /var/www;
或者
alias /var/www/test;
使用root
是首选方式。
至于部分,当服务器上有目录时,http://example.com/test
nginx 会发送 301 重定向到。你的问题没有显示上层的指令是什么,所以我不知道在哪个路径中检查是否存在。http://example.com/test/
test
root
test