ข้อผิดพลาด 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;
    #}
}

คำตอบ:


78

มันเป็นเรื่องที่แปลกดี แต่ฉันจะพนันได้ว่าปัญหาคือ:

        try_files $uri $uri/ /index.html;

ปัญหาที่นี่คือพารามิเตอร์ที่สองที่นี่$uri/ทำให้แต่ละไฟล์ในindexคำสั่งของคุณที่จะลอง หากไม่พบสิ่งใดเลยมันจะย้ายไป/index.htmlที่ซึ่งทำให้locationบล็อกเดียวกันนั้นถูกป้อนอีกครั้งและเนื่องจากยังไม่มีอยู่คุณจะได้รับการวนซ้ำไม่รู้จบ

ฉันจะเขียนสิ่งนี้เป็น:

        try_files $uri $uri/ =404;

เพื่อส่งคืนข้อผิดพลาด 404 หากไม่มีไฟล์ดัชนีที่คุณระบุในindexคำสั่งนั้นมีอยู่


BTW คำขอที่คุณเห็นนั้นเป็นเสียงรบกวนจากอินเทอร์เน็ต โดยเฉพาะอย่างยิ่งพวกเขาเป็นโพรบเพื่อตรวจสอบว่าเว็บเซิร์ฟเวอร์ของคุณเป็นพร็อกซีเปิดหรือไม่และสามารถใช้เพื่อซ่อนที่มาของผู้ใช้ที่เป็นอันตรายเมื่อเขาไปทำกิจกรรมที่เป็นอันตราย เซิร์ฟเวอร์ของคุณไม่ใช่พร็อกซีเปิดในการกำหนดค่านี้ดังนั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับมัน


ขอบคุณสำหรับคำอธิบาย มีวิธีใดบ้างที่สามารถบล็อก / แบนโพรบเหล่านี้ได้หรือไม่
pavs-maha

ไม่จริงเพียงให้อาหาร 404 ที่ดีและพวกเขาจะคิดออกในที่สุด
Michael Hampton

2
สิ่งที่ "ตลก" คือการกำหนดค่าเริ่มต้นในอูบุนตู 13.10 มีtry_files $uri $uri/ /index.html;และindex index.php index.html index.htm;ตั้งค่า ทำให้เกิดข้อผิดพลาดในคำถาม ไม่ใช่สำหรับ 12.04 และ 14.04 ดังนั้นมีโอกาสน้อยที่จะเกิดขึ้นบนเซิร์ฟเวอร์
leifcr

9

คุณจะได้รับข้อความแสดงข้อผิดพลาดนี้หากคุณindex.phpหายไปทั้งหมด


ใช่ในกรณีของฉันฉันทำผิดพลาดในการวางเส้นทางบนพารามิเตอร์รูท
dlopezgonzalez

8

มันน่ารำคาญ มันทำงานได้ไม่กี่สัปดาห์ที่ผ่านมาและมันก็ล้มเหลวกับฉันเมื่อฉันลองวันนี้

ฉันเชื่อว่าการอัปเกรดnginxแพคเกจUbuntu ทำให้ไดเรกทอรีเริ่มต้นที่ Ubuntu เก็บไฟล์ดัชนีมาตรฐานไว้ดังนั้นบรรทัด:

root /usr/share/nginx/www;

/usr/share/nginx/htmlจะไม่ทำงานอีกต่อไปเป็นที่ตั้งของไฟล์ที่อยู่ที่

เพื่อแก้ไขหนึ่งสามารถเปลี่ยนตัวชี้รูตไปยังไดเรกทอรีที่ถูกต้องหรือสร้าง symlink เป็นไดเรกทอรีใหม่:

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

ได้ผลสำหรับฉัน


2

ฉันพบปัญหานี้เมื่อวานนี้เพราะฉันทดสอบ nginx บนพร็อกซีเซิร์ฟเวอร์ที่แคชการเปลี่ยนเส้นทางที่ไม่มีอยู่อีกต่อไป ทางออกสำหรับฉันคือไป$ sudo service squid3 restartที่พร็อกซีเซิร์ฟเวอร์ squid3 ที่ฉันกำลังเชื่อมต่อ


แจ้งให้ทราบล่วงหน้าฉันแบ่งปันคำตอบนี้ด้วยความตั้งใจดี มีสาเหตุหลายประการสำหรับข้อผิดพลาดนี้และใช้เวลาในการคิดแคชพร็อกซี
Ninjaxor

2

มีข้อผิดพลาดนี้วันนี้ใช้เวลาสองสามชั่วโมงเพื่อหาสาเหตุ กลายเป็นคนลบไฟล์ทั้งหมดของเว็บไซต์


1

เพียงเพิ่มกรณีอื่นเมื่อเกิดเหตุการณ์นี้ เช่นเดียวกับคำตอบที่ยอมรับโดยทั่วไปสิ่งนี้จะเกิดขึ้นเมื่อมีการลองลำดับสถานที่แล้วเรียงลำดับลูปการเปลี่ยนเส้นทางภายใน (ไม่มีที่สิ้นสุด)

บางครั้งมันก็ปรากฏขึ้นด้วยการตั้งค่า NGINX ที่ไม่ดีและแม้จะมีข้อ จำกัด chmod (ในการกำหนดค่าการล็อกบางอย่าง) นี่คือตัวอย่าง

สมมติว่าคุณมีindex.phpส่วนควบคุมด้านหน้าเหมือนปกติ:

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

คุณส่วนใหญ่ให้บริการ URL ที่ SEO เช่นผ่านของคุณ/some/thingindex.php

แต่ตามปกติมีบางไฟล์ PHP ที่คุณจะต้องมีการสัมผัสโดยตรง (จึงไม่location ~\.phplocation = /index.php

นอกจากนี้สมมติว่าคุณเพิ่มindex.phpเป็นchmod0400 สำหรับการปิดระบบความปลอดภัย

ทุกอย่างยังคงทำงานได้ดีในกรณีนี้ตราบใดที่เจ้าของไฟล์เป็น "ผู้ใช้ 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; }
Brabus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.