使用以下 Nginx 配置时,我注意到我得到了一个无限循环的位置处理。根据我对文档的理解,我期望请求仅根据我的指令http://localhost:8080
返回我的文件。相反,请求映射到循环中,每次都附加一个 /,这取决于我从 X-debug 标头中看到的内容。我的调试消息的输出是:index.html
index
location /
X-debug-one:location / /////////// /var/www/content
如您所见,$uri 在几次迭代中不断增长。如果不遵守索引指令,它还有什么意义呢?我希望在流程的某个阶段测试索引?
这是我的配置。我肯定忽略了某些显而易见的东西。请注意,这是在 Docker 容器内部运行的,端口映射到 8080。
server {
server_name _;
listen 80 default_server;
root /var/www/content;
index index.html;
access_log /dev/stdout;
error_log /dev/stdout info;
add_header X-debug-base "base $uri $document_root" always;
location / {
add_header X-debug-one "location / $uri $document_root" always;
try_files $uri $uri/;
}
}
编辑:
以下是来自 Docker 外部(localhost:8080)和 docker 内部(localhost:80)的 curl(curl -sSL -D - “localhost:8080” -o /dev/null)的响应
HTTP/1.1 500 Internal Server Error
Server: nginx/1.10.3
Date: Sat, 06 Jan 2018 22:55:35 GMT
Content-Type: text/html
Content-Length: 193
Connection: close
X-debug-one: location / /////////// /var/www/content
这是日志,捕获了我的 curl 并且我认为那里也有一个 Chrome 请求。
unyozi_1 | 2018-01-06 22:57:23,869 DEBG 'nginx' stdout output:
unyozi_1 | 127.0.0.1 - - [06/Jan/2018:22:57:23 +0000] "GET / HTTP/1.1" 500 193 "-" "curl/7.52.1"
unyozi_1 |
unyozi_1 | 2018-01-06 22:57:37,722 DEBG 'nginx' stdout output:
unyozi_1 | 2018/01/06 22:57:37 [error] 11#0: *13 rewrite or internal redirection cycle while internally redirecting to "////////////", client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", host: "localhost"
unyozi_1 |
unyozi_1 | 2018-01-06 22:57:37,722 DEBG 'nginx' stdout output:
unyozi_1 | 127.0.0.1 - - [06/Jan/2018:22:57:37 +0000] "GET / HTTP/1.1" 500 193 "-" "curl/7.52.1"
unyozi_1 |
unyozi_1 | 2018-01-06 22:58:43,546 DEBG 'nginx' stdout output:
unyozi_1 | 2018/01/06 22:58:43 [error] 11#0: *14 rewrite or internal redirection cycle while internally redirecting to "/sockjs-node/info///////////", client: 172.19.0.1, server: _, request: "GET /sockjs-node/info?t=1515279507454 HTTP/1.1", host: "localhost:8080", referrer: "http://localhost:8080/"
unyozi_1 |
unyozi_1 | 2018-01-06 22:58:43,547 DEBG 'nginx' stdout output:
unyozi_1 | 172.19.0.1 - - [06/Jan/2018:22:58:43 +0000] "GET /sockjs-node/info?t=1515279507454 HTTP/1.1" 500 595 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
unyozi_1 |
编辑 2:/var/www/content/index.html 是一个存在的文件。
答案1
问题在于:
try_files $uri $uri/;
/
在 中的参数末尾添加try_files
会导致它尝试使用index
指令中指定的路径访问该 URL(在您的情况下是)index.html
。
当您加载 时/
,try_files 首先尝试$uri
,但不匹配,然后它到达$uri/
并尝试/index.html
,这会重新进入同一个location
块。由于index.html
不存在,它$uri/
再次到达,返回/index.html
再次尝试,重新进入该location
块,并给出rewrite or internal redirection cycle
错误。
要解决此问题,请为 中未找到静态文件的情况指定一个合理的默认值try_files
。如果您有一个仅包含静态内容的网站,则该默认值可能是=404
。如果您要运行 Web 应用程序,则该默认值可能是该应用程序的位置。例如:
try_files $uri $uri/ =404; # Static site
try_files $uri $uri/ /index.php; # PHP front controller
try_files $uri $uri/ @uwsgi; # pass to a named location