此nginx错误“重写或内部重定向周期”是什么意思?


67
tail -f /var/log/nginx/error.log
2013/05/04 23:43:35 [error] 733#0: *3662 rewrite or internal redirection cycle while internally redirecting to "/index.html", client: 127.0.0.1, server: _, request: "GET /robots.txt HTTP/1.1", host: "kowol.mysite.net"
HTTP/1.1", host: "www.joesfitness.net"
2013/05/05 00:49:14 [error] 733#0: *3783 rewrite or internal redirection cycle while internally redirecting to "/index.html", client: 127.0.0.1, server: _, request: "GET / http://www.qq.com/ HTTP/1.1", host: "www.qq.com"
2013/05/05 03:12:33 [error] 733#0: *4232 rewrite or internal redirection cycle while internally redirecting to "/index.html", client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", host: "joesfitness.net"

我从nginx错误日志中获取这些信息,我没有“ kowol”子域,我的网站上没有指向qq.com或joesfitness.net的任何链接。这是怎么回事?

编辑:Nginx默认配置:

server {
    listen   8080; ## listen for ipv4; this line is default and implied
    listen   [::]:8080 default ipv6only=on; ## listen for ipv6

    root /usr/share/nginx/www;
    index index.php index.html index.htm;

    # Make site accessible from http://localhost/
    server_name _;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to index.html
        try_files $uri $uri/ /index.html;
        # Uncomment to enable naxsi on this location
        # include /etc/nginx/naxsi.rules
    }

    location /doc/ {
        alias /usr/share/doc/;
        autoindex on;
        allow 127.0.0.1;
        deny all;
    }

    # Only for nginx-naxsi : process denied requests
    #location /RequestDenied {
        # For example, return an error code
        #return 418;
    #}

    #error_page 404 /404.html;

    # 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/www;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

        # With php5-cgi alone:
        fastcgi_pass 127.0.0.1:9000;
        #With php5-fpm:
        #fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #   deny all;
    #}
}

Answers:


78

好的,这很奇怪,尽管我敢打赌问题在于:

        try_files $uri $uri/ /index.html;

这里的问题在于,这里的第二个参数$uri/导致index依次尝试使用指令中的每个文件。如果未找到,则将其移至/index.html,这将导致location重新输入相同的块,并且由于该块仍然不存在,您将得到一个无限循环。

我将其重写为:

        try_files $uri $uri/ =404;

如果index指令中指定的索引文件都不存在,则返回404错误。


顺便说一句,您看到的那些请求是Internet背景噪音。特别是,它们是确定您的Web服务器是否为开放代理服务器的探针,可以在恶意用户执行恶意活动时被滥用以隐藏恶意用户的来源。您的服务器不是此配置中的开放代理,因此您实际上不必担心它。


感谢您的解释。有什么办法可以阻止/禁止这种探测?
pavs-maha

并不是完全正确,只要给他们提供一个不错的404,他们最终就会弄清楚。
迈克尔·汉普顿

2
什么是“搞笑”是在Ubuntu 13.10是默认的配置已经try_files $uri $uri/ /index.html;index index.php index.html index.htm;设置。导致问题中的错误。12.04和14.04并非如此,因此在服务器上发生的可能性较小。
leifcr 2014年

9

如果您index.php完全丢失,您还将收到此错误消息。


是的,在我的情况下,我将路径放在root参数上犯了一个错误。
dlopezgonzalez '16

8

真烦人 几周前,它开始工作了,今天我尝试时对我失败了。

我相信Ubuntu nginx软件包的升级会导致Ubuntu更改标准索引文件的默认目录更改,因此该行:

root /usr/share/nginx/www;

文件位置在,将不再起作用/usr/share/nginx/html

要修复,只需将根指针更改为正确的目录,或创建指向新目录的符号链接:

cd /usr/share/nginx
sudo ln -s html www

为我工作。


2

昨天我遇到了这个问题,因为我正在通过代理服务器测试nginx,该代理服务器已缓存了不再存在的重定向。对我来说,解决方案是$ sudo service squid3 restart在我通过其连接的squid3代理服务器上。


请注意,我本着良好的意愿分享了这个答案。出现此错误的原因多种多样,需要花费一些时间才能找出代理缓存的原因。
忍者

2

今天有此错误,请花几个小时找出原因。原来有人删除了该网站的所有文件。


1

只是在发生这种情况时添加另一种情况。就像在接受的答案中一样,通常会在尝试一系列位置然后创建内部重定向循环(永无止境)时发生这种情况。

有时,NGINX配置错误,甚至限制性chmod(在某些锁定配置中)也可能显示出来。这是例子。

index.php像通常一样,假设您有前端控制器:

location / {
    try_files $uri $uri/ /index.php?$args;
}
location ~\.php {
   ...
}

您通常会/some/thing通过来提供SEO网址index.php

但是像往常一样,您需要直接公开一些PHP文件(因此location ~\.php和不需要)location = /index.php

另外,假定你index.phpchmod-ded到0400的安全锁定。

在这种情况下,只要文件由“ PHP-FPM用户”拥有,一切仍然可以正常工作。NGINX不需要读取文件,因为它只是将其文件名传递给PHP-FPM来执行并返回FastCGI响应。

然后,您想处理某人访问时发生的情况,/non-existent.php因为使用此相当标准的配置,您将获得No input file specified.该情况。

为了解决这个问题,有些人补充说:

if (!-e $request_filename) { rewrite / /index.php last; } ## Catch 404s that try_files miss

好吧,if按照nginx来说,当然是邪恶的,但这不是事实。现在,一切都会因重定向周期错误而中断。为什么?

由于此序列是循环发生的:

  • /some/page请求URL时,nginx输入location /,找不到真正的文件并将其转换为/index.php
  • 然后,它进入.php位置块并尝试检查它是否可以读取index.php。由于无法执行,因此将其重写为相同的名称,index.php然后.php再次返回。

谢谢Danila Vershinin!这对我有帮助:location / {try_files $ uri $ uri / /index.php?$args; }
布拉布斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.