इस 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, आपके द्वारा देखे जा रहे अनुरोध इंटरनेट बैकग्राउंड शोर हैं । विशेष रूप से, वे यह निर्धारित करने के लिए जांच कर रहे हैं कि क्या आपका वेब सर्वर एक खुली प्रॉक्सी है और दुर्भावनापूर्ण उपयोगकर्ता के मूल को छिपाने के लिए दुर्व्यवहार किया जा सकता है जब वह दुर्भावनापूर्ण गतिविधि करने के लिए जाता है। आपका सर्वर इस कॉन्फ़िगरेशन में एक खुला प्रॉक्सी नहीं है, इसलिए आपको वास्तव में इसके बारे में चिंता करने की आवश्यकता नहीं है।


स्पष्टीकरण के लिए धन्यवाद। क्या कोई ऐसा तरीका है जो इस तरह की जांच को रोक / रोक सकता है?
पावस-माहा ५'१३ को

वास्तव में नहीं, बस उन्हें एक अच्छा 404 खिलाओ और वे अंततः इसका पता लगाएंगे।
माइकल हैम्पटन

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पैकेज का अपग्रेड डिफॉल्ट डायरेक्टरी का कारण बनता है, जहां उबंटू ने मानक सूचकांक फाइलों को बदल कर रखा है, इसलिए लाइन:

root /usr/share/nginx/www;

फ़ाइलों के स्थान पर अब और काम नहीं करेंगे /usr/share/nginx/html

ठीक करने के लिए, कोई रूट पॉइंटर को सही निर्देशिका में बदल सकता है, या नई निर्देशिका के लिए एक सिमलिंक बना सकता है:

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

मेरे लिये कार्य करता है।


2

मैं कल इस समस्या में भाग गया क्योंकि मैं एक प्रॉक्सी सर्वर पर nginx का परीक्षण कर रहा था जिसने एक पुनर्निर्देशित कैश किया था जो अब अस्तित्व में नहीं था। मेरे लिए समाधान मेरे द्वारा $ sudo service squid3 restartकनेक्ट किए जा रहे स्क्वीड 3 प्रॉक्सी सर्वर पर था।


नोटिस मैंने यह उत्तर अच्छे इरादों के साथ साझा किया। इस त्रुटि के कई कारण हैं और प्रॉक्सी कैशिंग का पता लगाने में कुछ समय लगता है।
निंजाक्सोर

2

आज यह त्रुटि थी, कारण जानने के लिए कुछ घंटे बिताएं। पता चला कि किसी ने साइट की सभी फाइलें हटा दी हैं।


1

ऐसा होने पर बस एक और मामला जोड़ना होगा। जैसा कि स्वीकृत उत्तर में, सामान्य रूप से, ऐसा तब होता है जब स्थानों के अनुक्रम की कोशिश की जा रही है और फिर आंतरिक पुनर्निर्देशित लूप (कभी न खत्म होने वाला) बनाया जाता है।

यह कभी-कभी खराब एनजीआईएनएक्स कॉन्फिग के साथ, और यहां तक ​​कि प्रतिबंधक चामोद (कुछ लॉकडाउन कॉन्फिग में) के साथ प्रकट होता है। यहाँ उदाहरण है।

मान लीजिए कि आपके index.phpसामने नियंत्रक है, हमेशा की तरह:

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

आप ज्यादातर /some/thingअपने माध्यम से एसईओ यूआरएल की सेवा करते हैं index.php

लेकिन हमेशा की तरह, कुछ PHP फाइलें हैं जिन्हें आपको सीधे उजागर करने की आवश्यकता है (इस प्रकार location ~\.phpऔर नहीं location = /index.php

यह भी मान लें कि सुरक्षा लॉकडाउन के लिए आपका 0400 तक index.phpका chmodवसीयतनामा है।

इस मामले में सब कुछ अभी भी ठीक काम करता है, जब तक कि फ़ाइल "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, निगनेक्स के अनुसार बुराई है, लेकिन यह इसके बारे में नहीं है। अब सब कुछ पुनर्निर्देशन चक्र त्रुटि के साथ टूट जाएगा। क्यों?

क्योंकि यह क्रम एक लूप में होता है:

  • जब /some/pageURL का अनुरोध किया जाता है, तो nginx प्रवेश करता है location /, एक वास्तविक फ़ाइल नहीं ढूंढता है और इसे चालू करता है/index.php
  • यह तब .phpलोकेशन ब्लॉक में प्रवेश करता है और यह जांचने की कोशिश करता है कि क्या यह पढ़ सकता है index.php। चूंकि यह नहीं हो सकता , इसलिए यह इसे फिर से लिखता है index.phpऔर .phpफिर से वापस आता है ।

धन्यवाद, दानिला वर्सिन ! इसने मेरे लिए मदद की: स्थान / {try_files $ uri $ uri / /index.php?osargs; }
ब्रेबस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.