फ़ाइल मौजूद होने पर ही Nginx URL को फिर से लिखना


13

मुझे Nginx के लिए एक पुनर्लेखन नियम लिखने की आवश्यकता है ताकि यदि कोई उपयोगकर्ता किसी पुरानी छवि url पर जाने का प्रयास करे:

/images/path/to/image.png

और फ़ाइल मौजूद नहीं है, इसे पुनः निर्देशित करने का प्रयास करें:

/website_images/path/to/image.png

नए URL में छवि मौजूद होने पर ही, अन्यथा 404 तक जारी रहें। हमारे होस्ट पर Nginx के संस्करण में अभी तक try_files नहीं हैं।

जवाबों:


19
location /images/ {
    if (-f $request_filename) {
        break;
    }

    rewrite ^/images/(.*) /new_images/$1 permanent;
}

हालाँकि, आप अपने होस्ट को अपग्रेड करने या एक बेहतर होस्ट ढूंढने के लिए बग करना चाहते हैं।


यह प्रत्येक 404 अधिकार पर / new_images पर रीडायरेक्ट करेगा? मैं फिर से लिखना नहीं चाहता जब तक कि मुझे नहीं पता कि new_images फ़ाइल मौजूद है
जोस फर्नांडीज

यह देखने के लिए जाँचता है कि क्या फ़ाइल मौजूद है, और यदि वह परीक्षण विफल रहता है, तो यह new_images पर रीडायरेक्ट करता है। उसके बाद जो होता है वह यहाँ निर्दिष्ट नहीं है।
टायलर

मुझे डर है कि आपके विकल्प को nginx के लेखकों द्वारा आम नुकसान के रूप में माना जाता है nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/…
Riverfall 10:22 पर

2
@riverfall हेह, मैंने उस पेज का हिस्सा लिखा। मेरा जवाब 8 साल पहले लिखा गया था, हां यह एक मूत थोड़ा पुराना है, लेकिन मूल प्रश्न विशेष रूप से कहा गया है कि उनके मेजबान ने नग्नेक्स का एक हालिया संस्करण प्रदान नहीं किया था, इसलिए उनके पास try_files तक पहुंच नहीं थी।
मार्टिन फेजोर्वाल्ड

1
@ Guillaume86 मैं इस बारे में चिंता नहीं करेगा, अगर एक + फिर से लिखना पूरी तरह से सुरक्षित है और एक फ़ाइल पर एक एकल जाँच बहुत हल्के वजन है। रखरखाव मोड की जांच करने के लिए बैकएंड एप्लिकेशन पर जाने की तुलना में यह बहुत तेज़ है।
मार्टिन फेजर्डवाल्ड

6

कृपया ifकिसी स्थान ब्लॉक के अंदर का उपयोग न करें । बुरी बातें हो सकती हैं।

location ~* ^/images/(.+)$ {
    root /www;
    try_files /path/to/$1 /website_images/path_to/$1 /any/dir/$1 @your404;
}

$1 try_files निर्देश में कोशिश करने के लिए फ़ाइल नाम बन जाता है, जिसे आप पूरा करने की कोशिश कर रहे हैं।

यह, या, बिना जाँच के इसे फिर से लिखें। अगर वह छवि नहीं है, तो आपको वैसे भी 404 मिलेगा।


हालांकि यह उत्तर सख्ती से इस सवाल का जवाब नहीं देता है ("[नहीं] try_filesअभी तक"), यहां आने वाले भविष्य के आगंतुकों के लिए, यह उत्तर अधिक वोट के योग्य है।
डरमीक

5

आप इस तरह से कुछ का उपयोग कर सकते हैं (अपने विशिष्ट मामले के लिए अप्रयुक्त):

location ^/images/(?<imgpath>.*)$ {

    set $no_old  0;
    set $yes_new 0;

    if (!-f $request_filename)
    {
        set $no_old 1;
    }

    if (-f ~* "^/new_path/$imgpath")
    {
        set $yes_new 1$no_old;
    }

    # replacement exists in the new path
    if ($yes_new = 11)
    {
        rewrite ^/images/(.*)$ /new_path/$1 permanent;
    }

    # no image in the new path!
    if ($yes_new = 01)
    {
        return 404;
    }
}

जो मूल रूप से नेस्टेड ifस्टेटमेंट लिखने का एक वैकल्पिक तरीका है , क्योंकि आप नेग्नेक्स में घोंसला नहीं बना सकते। इस "हैक" पर आधिकारिक संदर्भ के लिए यहां देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.