কীভাবে এনজিএনএক্সে ফ্যালব্যাক ত্রুটি পৃষ্ঠা সেট আপ করবেন?


10

আমি এই মুহুর্তে কিছু ত্রুটি পৃষ্ঠাগুলি এবং অন্যান্য "ডিফল্ট" মিডিয়া ফাইলগুলি (যেমন ফেভিকন.ইকো এবং রোবটস. টেক্সট) এনজিঞ্জের হ্যান্ডলিংটি কনফিগার করছি এবং নির্দিষ্ট ত্রুটি পৃষ্ঠাগুলির জন্য যেভাবে চাই তার জিনিসগুলি কাজ করতে আমি একটি ছোট সমস্যা হয়ে পড়েছি ran ।

মূলত, আমি যা করার চেষ্টা করছি তা হ'ল সেই সার্ভারের মূলের নীচে একটি সার্ভারের জন্য নির্দিষ্ট ফাইলগুলি পরিবেশন করা, যেমন /var/www/someserver.com/robots.txt। যদি সেই ফাইলটি বিদ্যমান না থাকে তবে আমি nginx "ডিফল্ট", অর্থাৎ /var/www/default/robots.txt এ যেতে চাই। এটি কীভাবে আমার (সফলভাবে) কনফিগার করা হয়েছে তার মূল কথাটি:

server {
    ...
    root /var/www/someserver.com;

    location ~* ^/(robots\.txt)$ {
        error_page 404 = @default;
    }

    location @default {
        root /var/www/default;
    }
}

এটি দুর্দান্ত কাজ করে।

আমি ত্রুটি পৃষ্ঠাগুলির জন্যও এটি করার চেষ্টা করছি এবং আমি তা ঘটতে পারছি না:

server {
    ...
    root /var/www/someserver.com;

    error_page 404   /404.html;

    location ~* ^/(404\.html)$ {
        error_page 404 = @default;
    }

    location @default {
        root /var/www/default;
    }
}

মনে রাখবেন যে এই "কাজ করে" এই অর্থে যে আপনি যদি someserver.com/404.html দেখতে যান তবে এটি প্রথমে /var/www/someserver.com/404.html লোড করার চেষ্টা করবে এবং তারপরে / var / www / ডিফল্টে পড়ে যাবে /404.html যদি এটি না পাওয়া যায়। যাইহোক, যদি আপনি someserver.com/blahblah যান, এটি 404 পৃষ্ঠাটি কেবলমাত্র /var/www/someserver.com/ এ সেট করা থাকলে দেখায়। ফাইলটি উপস্থিত না থাকলে এটি ডিফল্ট ডিরেক্টরিতে ফিরে আসে না।

যাইহোক, আপনি সম্ভবত যা অর্জন করতে চাইছিলাম তা করতে পারেন (এজন্য আমি প্রথম কাজের উদাহরণটি অন্তর্ভুক্ত করেছি)।

কোন ধারনা?

সম্পাদনা:

মার্টিন এফ এর উত্তরের ভিত্তিতে, এটিই আমি একসাথে রেখে শেষ করেছি:

# Doesn't work when error page is returned on a POST request
server {
    ...
    root /var/www/someserver.com;

    error_page  404         = @notfound;
    error_page  500 502 504 = @server_error;
    error_page  503         = @maintenance;

    location @notfound {
        try_files /404.html /../default/404.html =404;
    }

    location @server_error {
        try_files /500.html /../default/500.html =500;
    }

    location @maintenance {
        try_files /503.html /../default/503.html =503;
    }
}

এটি দুর্দান্ত কাজ করে। উপরের ত্রুটি_পৃষ্ঠাগুলি এবং অবস্থানগুলির প্রকৃত ব্লকটি একটি সার্ভার_দেফাফলস.কোনফ ফাইলে রয়েছে যা প্রতিটি ভার্চুয়াল হোস্টের সাথে অন্তর্ভুক্ত হয়, এই কারণেই আমি প্রতিটি লোকেশনে পাথটি হার্ড কোড করি নি এবং ডিফল্টগুলির জন্য একটি আপেক্ষিক পথ ব্যবহার করি।

সম্পাদনা 2:

এই পদ্ধতির একটি সমস্যা আছে। যদি আপনি এমন কোনও URL- এ পোস্ট করেন যা কোনও ত্রুটি ফিরিয়ে দেয়, তবে POST অনুরোধ পদ্ধতিটি চেষ্টা_ফাইলে প্রচেষ্টা সহ প্রেরণ হয়। এটি (আমার জন্য) একটি 405 মঞ্জুরিপ্রাপ্ত ত্রুটির ফলস্বরূপ, কারণ এনজিনেক্স মূলত কেবল পৃষ্ঠাটি পাওয়ার পরিবর্তে উদাহরণস্বরূপ /default/500.html পোষ্ট করার চেষ্টা করছে।

সম্পাদনা 3:

আমি এমন একটি সমাধান পোস্ট করেছি যা কাজ করে যা আমার আসল ধারণার অনেক কাছাকাছি।

উত্তর:


10

আমি আমার আসল ধারণার অনেক কাছে গিয়ে শেষ করেছি up আমি যে কীটি অনুপস্থিত ছিল তা নির্দেশিকা হিসাবে প্রমাণিত হয়েছিল recursive_error_pages। আমার সত্যিই যা করতে হবে তা হ'ল এটি "চালু" এবং আমার আসল ধারণাটি কাজ করেছিল। আমার কনফারেন্সের প্রাসঙ্গিক অংশটি দেখতে এখন কেমন দেখাচ্ছে তা এখানে:

server {
    ...

    root /var/www/someserver.com/;

    error_page 400 404      /404.html;
    error_page 500 502 504  /500.html;
    error_page 503          /503.html;

    recursive_error_pages   on;

    location ~* ^/(404\.html|500\.html|503\.html)$ {
        log_not_found off;
        error_page 404 = @default;
    }

    location @default {
        log_not_found on;
        root /var/www/default;
    }
}

আমি অন্যান্য ত্রুটিযুক্ত ধরণেরগুলি এখানে অন্তর্ভুক্ত করেছি যা আমার মূল প্রশ্নের অংশ ছিল না কারণ এটিই আমাকে মার্টিন এফ এর পদ্ধতির সাথে অসুবিধার সৃষ্টি করেছিল, যা অন্যথায় দুর্দান্ত ছিল। log_not_foundনির্দেশ শুধু যে আমি আমার লগে 404s পাবেন না যখন ত্রুটি পৃষ্ঠা মূল শিকড় পাওয়া যায় না নিশ্চিত করে।


এটি গ্রেট কাজ করে (উদাঃ 404 / পোস্ট সংমিশ্রণ) তবে এটি HTTP ত্রুটি কোডটি গ্রাস করে 200 টি প্রেরণ করে ... আমার মতো আপনার আচরণও কি একই রকম?
অক্টোবর

2
আপনি এর পরিবর্তে অপসারণ log_not_found off;এবং যুক্ত করতে চাইতে পারেন internal;
অ্যালিক্স অ্যাক্সেল

একটি পোষ্ট অনুরোধের সাথে আপনি যে সমস্যার বিষয়টি লক্ষ্য করেছেন সেটি হ'ল এনজিনেক্সের
রোবো

5

try_files এখানে যাওয়ার উপায়। নিম্নলিখিত কনফিগারেশনের কাজ করা উচিত, তবে আমি সিনট্যাক্স ত্রুটির জন্য এটি পরীক্ষা করিনি।

server {
    ...
    root /var/www;

    location / {
        try_files /someserver.com$uri /default$uri /someserver.com$uri/ /default$uri/ @notfound;
    }

    location @notfound {
       try_files /someserver/404.html /default/404.html =404; # =404 should make it use the nginx-default 404 page.
    }
}

হ্যাঁ, এটাই আমার দরকার ছিল। আমি চেষ্টা_ফায়াল ব্যবহার করার চেষ্টা করেছি কিন্তু আপনার উত্তর আমাকে বুঝতে পেরেছিল যে এর জন্য আমার একটি বিশেষ অভ্যন্তরীণ অবস্থান তৈরি করা দরকার। আমার পক্ষে যে কনফিগারেশনটি কাজ করেছিল তা দেখানোর জন্য আমি আমার উত্তর সম্পাদনা করেছি, যা আপনার পরামর্শ অনুসারে কয়েকটি টুইট করেছে।
জিম ডি

আমার সম্পাদনা উপরে 2 দেখুন। আমি যা বলতে পারি তা থেকে এই পরামর্শটি পোষ্ট অনুরোধগুলির সাথে কাজ করে না। যেহেতু ট্রাই_ফায়ালগুলি মূল অনুরোধের অনুরোধ পদ্ধতিটি ব্যবহার করে, তাই আপনি 405 অনুমোদিত নয় প্রতিক্রিয়া দিয়ে শেষ করেন।
জিম ডি

@ জিমডি: আচ্ছা আপনি ঠিক এই পদ্ধতির ব্যবহার করেন না, আপনি একটি পরিবর্তিত ব্যবহার করেন। এটি আমার পক্ষে কাজ করে। আপনার এনগিনেক্স বাইনারিটি 0.8.x এর চেয়ে পুরনো হলে আপগ্রেড করার চেষ্টা করুন
মার্টিন এফজর্ডওয়াল্ড

ঠিক আছে, সমস্যাটি আমি এটি কেবল 404 এরও বেশি সময় ধরে ব্যবহার করছি, যার কারণে আমাকে ত্রুটি_পৃষ্ঠা -> অবস্থান -> অবস্থানের পরিবর্তে -> চেষ্টা_ফায়ালগুলি -> অবস্থান -> আপনি যেমন চেষ্টা করছেন ততই করতে হবে। তবে আমি একটি প্যাকেজ থেকে 0.7.x বাইনারিতে রয়েছি, তাই আমি উত্স থেকে এটি তৈরির চেষ্টা করব এবং এটি সমাধান করে কিনা তা দেখার চেষ্টা করব।
জিম ডি

2

দুর্ভাগ্যক্রমে আমি আমার উত্তরটি নিয়ে কয়েক বছর দেরিতে আছি তবে আমি ভেবেছিলাম এটি ভবিষ্যতের অনুসন্ধানকারীদের সহায়তা করতে পারে। আমার ইনস্টল করা Nginx সংস্করণটি 1.2.4, এবং আমি নিম্নলিখিত কনফিগারেশন স্নিপেট তৈরি করেছি,

server {

server_name www.example.com
root /var/www/example


## Errors -> Locations
error_page   400 /400.html;
error_page   403 /403.html;
error_page   404 /404.html;
error_page   500 502 503 504 /50x.html;

## Locations -> Fallback
location = /400.html {
    try_files /400.html @error;
    internal;
}
location = /403.html {
    try_files /403.html @error;
    internal;
}
location = /404.html {
    try_files /404.html @error;
    internal;
}
location = /50x.html {
    try_files /50x.html @error;
    internal;
}

## Fallback Directory
location @error {
    root /var/www/error;
}

}

1
এর ভাল ব্যবহার internal
ক্লিন্ট পাচল

0

আমি খুঁজে পেয়েছি "প্রক্সি_ইন্টারসেপ্ট_অর্থগুলি চালু করা"; যে কোনও লোকেশন ব্লকে যেখানে ত্রুটি_পৃষ্ঠাও অন্তর্ভুক্ত ছিল।

এই সেটিংটি ছাড়াই, অবস্থানের ব্লকটি প্রবাহ থেকে ফিরে আসা ত্রুটি কোডগুলিকে আটকাবে cept

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.