এই 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 ডিফল্ট কনফিগার:

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নির্দেশিকার নির্দেশিকায় নির্দিষ্ট করা ইনডেক্স ফাইলগুলির কোনও উপস্থিত না থাকে।


বিটিডাব্লু, আপনি যে অনুরোধগুলি দেখছেন তা হ'ল ইন্টারনেট ব্যাকগ্রাউন্ড শোরগোল । বিশেষত, আপনার ওয়েব সার্ভারটি একটি ওপেন প্রক্সি কিনা তা নির্ধারণের জন্য তারা তদন্তকারী এবং যখন তিনি দূষিত ক্রিয়াকলাপ করতে যান তখন কোনও দূষিত ব্যবহারকারীর উত্স লুকিয়ে রাখতে অপব্যবহার করা যেতে পারে। আপনার সার্ভারটি এই কনফিগারেশনের একটি উন্মুক্ত প্রক্সি নয়, সুতরাং আপনাকে সত্যই এটি নিয়ে চিন্তা করার দরকার নেই।


ব্যাখ্যা করার জন্য ধন্যবাদ. এই ধরণের প্রোবগুলি ব্লক / নিষিদ্ধ করার কোনও উপায় আছে কি?
pavs-maha

আসলেই নয়, কেবল তাদের একটি ভাল 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

আমি গতকাল এই সমস্যায় পড়েছিলাম কারণ আমি এমন প্রক্সি সার্ভারের উপরে এনজিনেক্স পরীক্ষা করছিলাম যা কোনও পুনর্নির্দেশকে ক্যাশে করেছিল যা আর নেই ex আমার জন্য সমাধানটি ছিল $ sudo service squid3 restartস্কুইড 3 প্রক্সি সার্ভারের মাধ্যমে যা দিয়েছিলাম।


নোটিশ আমি এই উদ্দেশ্যটি ভাল উদ্দেশ্য নিয়ে ভাগ করেছি। এই ত্রুটির জন্য একাধিক কারণ রয়েছে এবং প্রক্সি ক্যাশেটি বের করার জন্য এটি কিছুটা সময় নেয়।
নিনজাকসর

2

আজ এই ত্রুটি থাকলে, কারণটি সনাক্ত করতে কয়েক ঘন্টা ব্যয় করুন। দেখা গেছে যে কেউ সাইটের সমস্ত ফাইল মুছে ফেলেছে।


1

যখন এটি ঘটে তখন কেবল অন্য কেস যুক্ত করতে। গৃহীত উত্তরের মতো, সাধারণভাবে, এটি ঘটে যখন লোকেশনগুলির ক্রম চেষ্টা করা হয় এবং তারপরে ধরণের অভ্যন্তরীণ পুনঃনির্দেশ লুপ (কখনই শেষ হয় না) তৈরি করা হয়।

এটি কখনও কখনও খারাপ এনজিআইএনএক্স কনফিগারেশনের মাধ্যমে এবং এমনকি সীমাবদ্ধ chmod (কিছু লকডাউন কনফিগারেশনে) দিয়ে উদ্ভাসিত হয়। এখানে উদাহরণ।

ধরা যাক আপনার মত index.phpসামনের নিয়ামক যেমন:

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

আপনি বেশিরভাগ এসইও ইউআরএল এর /some/thingমাধ্যমে আপনার মাধ্যমে পরিবেশন করেন index.php

তবে যথারীতি, কিছু পিএইচপি ফাইল রয়েছে যা আপনার সরাসরি উন্মুক্ত করা দরকার (সুতরাং location ~\.phpএবং নাও) location = /index.php

মনে করুন যে সুরক্ষা লকডাউনের জন্য আপনার 0400-এ উন্নীত index.phpহয়েছিল chmod

এই ফাইলটিতে যতক্ষণ না ফাইল "পিএইচপি-এফপিএম ব্যবহারকারীর" মালিকানা থাকে ততক্ষণ সবকিছু ঠিকঠাক কাজ করে। এনজিআইএনএক্স ফাইলটি পড়ার দরকার নেই, কারণ এটি কেবল মৃত্যুদন্ড কার্যকর করার জন্য নিজের ফাইলের নাম পিএইচপি-এফপিএমকে দেয় এবং ফাস্টসিজিআই প্রতিক্রিয়া ফিরে পায়।

তারপরে আপনি যখন /non-existent.phpযাবেন তখন কী ঘটে যায় তার একটি মামলা আপনি পরিচালনা করতে চান কারণ এই বরং মানক কনফিগারেশনের মাধ্যমে আপনি No input file specified.সেই ক্ষেত্রে পাবেন।

এটির মোকাবেলায় কিছু লোক যুক্ত করে:

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

ঠিক আছে, অবশ্যই ifএনজিঙ্ক্স অনুসারে মন্দ, কিন্তু এটি এটি সম্পর্কে নয়। পুনঃনির্দেশ চক্র ত্রুটির সাথে সবকিছু এখন ভেঙে যাবে। কেন?

কারণ এই ক্রমটি একটি লুপে ঘটে:

  • যখন /some/pageইউআরএল অনুরোধ করা হয়, এনজিনেক্স প্রবেশ করে location /, একটি আসল ফাইল খুঁজে পায় না এবং এটিকে ঘুরিয়ে দেয়/index.php
  • এরপরে এটি .phpঅবস্থানের ব্লকে প্রবেশ করে এবং এটি পড়তে পারে কিনা তা পরীক্ষা করার চেষ্টা করে index.php। যেহেতু এটি পারে না , এটি এটি আবার একইভাবে index.phpআবার লিখে দেয় এবং .phpআবার ফিরে আসে ।

ধন্যবাদ, ড্যানিলা ভার্শিনিন ! এটি আমার জন্য সহায়তা করেছে: অবস্থান / {try_files $ uri $ uri / /index.php?$args; }
ব্রাবাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.