nginx 使用 try_files 和索引进行无限循环

nginx 使用 try_files 和索引进行无限循环

使用以下 Nginx 配置时,我注意到我得到了一个无限循环的位置处理。根据我对文档的理解,我期望请求仅根据我的指令http://localhost:8080返回我的文件。相反,请求映射到循环中,每次都附加一个 /,这取决于我从 X-debug 标头中看到的内容。我的调试消息的输出是:index.htmlindexlocation /

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

相关内容