नार्नेक्स प्रश्न को अंडरस्कोर के साथ क्वेरिस्ट्रिंग प्रश्न चिह्न को बदलने के लिए फिर से लिखना


16

स्थैतिक HTML के रूप में पूरी वेबसाइट को मिरर करने के लिए,

मैं जैसे URL परिवर्तित करने के लिए चाहते हैं http://example.com/script.php?t=12के लिए http://example.com/script.php_t=12

?URL में सूचना को परिवर्तित किया जा रहा है _

यह nginx या अपाचे को डिस्क से इन फ़ाइलों की सेवा करने की अनुमति देगा, क्योंकि हमने प्राप्त किए गए कच्चे HTML wgetको प्रत्येक URL के लिए - एक PHP फ़ाइल के बजाय - से बचाया है ।

क्या Nginx URL पुनर्लेखन के माध्यम से ऐसा करना संभव है?


यह निश्चित रूप से संभव है, लेकिन वास्तव में अजीब है। आप इसके लिए क्या चाहते हैं?
एलेक्सी टेन

2
इस दृष्टिकोण के साथ एक समस्या यह है कि एक URL में कई GET पैरामीटर किसी भी क्रम में हो सकते हैं, और जब आप यह रूपांतरण करते हैं, तो आप URL के शब्दार्थ को बदल देंगे।
तेरो किलकेनन

स्थैतिक html में एक पुराने मंच को संग्रहित करने के लिए, लेकिन हाँ इस काम http://example.com/script.php?a=1&t=3को करने के लिए कुछ सुपर फैंसी रीराइट एक्शन की आवश्यकता होने वाली है
सैम सैफ्रन

1
@tero querystring URLs, व्यवहार में, हमेशा एक ही क्रम में होते हैं। तो यह एक गैर मुद्दा है।
जेफ एटवुड

1
@chx यह एक पुराने मंच संग्रह के लिए है, तो तर्क के अलावा अन्य किया जा सकता है tकी तरह f, uआदि
अर्पित जालान

जवाबों:


15

मुझे यह काम try_files का उपयोग करके मिला है:

location / {
    try_files "${uri}_${args}" 404.html;
}

यह डिस्क पर एक फ़ाइल खोजने की कोशिश करेगा जिसका नाम आपके द्वारा दिए गए पैटर्न के बजाय "_" के साथ दिया गया है।

आगे की कॉन्फ़िगरेशन इस बात पर निर्भर करती है कि आपने छवियों या स्टाइलशीट जैसी स्थिर फ़ाइलों को कैसे बचाया। आप बिना क्वेरी स्ट्रिंग प्रपत्र डिस्क के बिना उन्हें पढ़ने की कोशिश कर एक फालबैक जोड़ सकते हैं:

location / {
    try_files "${uri}_${args}" $uri 404.html;
}

1
बहुत दिलचस्प दृष्टिकोण, क्या यह एक संभावित डिस्क को पढ़ने और सभी संभावित URL पर "फ़ाइल नहीं मिली" का कारण होगा?
जेफ एटवुड

से try_files : "चेकों निर्दिष्ट क्रम में फ़ाइलों के अस्तित्व और अनुरोध प्रक्रिया के लिए पहली बार मिलती फ़ाइल का उपयोग करता है"। तो इससे आपके प्रश्न में URL के लिए कोई अतिरिक्त डिस्क रीड नहीं होगी।
मथायस बायर

1
ठीक है, अगर हम इसे काम में location ~ \.php$try_fileslocation /
जेफ एटवुड

+1 कर्ली ब्रेसिज़ का उपयोग करने के उदाहरण के लिए :)
दानिला वर्शिन

4

रेखाओं के साथ कुछ:

location ~ \.php$ {
  # only rewrite URL's with args
  if ($args != '') {
    rewrite .* "${uri}_${args}?" last;
  }
}

आपने ?मेरा उपयोग किया हुआ उत्तर छोड़ दिया ।
चक्स

आप इस संबंध में सही हैं, आपके उत्तर के रूप में - मुझे असली सर्वर पर इसे जांचने में कुछ समय लगा, इसलिए मैंने आपका तब तक नहीं देखा जब तक कि मैंने मेरा पोस्ट नहीं किया। और तुम्हारा "" _ "क्या अवांछनीय हो सकता है" के साथ तर्कों के बिना सभी URL के भी फिर से लिखना होगा।
मैक्स गशकोव

माथियास से try_files वाला घोल वास्तव में इसके लिए अधिक बेहतर है।
मैक्स गशकोव

हम इसे बिना तब कर सकते हैं, जब हम .*पहले रीराइट परम में अधिक सख्त खंड निर्दिष्ट करते हैं । यह बेहद मददगार है!
जेफ एटवुड

@ जेफटवुड मुझे नहीं लगता कि यह संभव है- नग्नेक्स फिर से लिखना (और साथ ही स्थान) पैटर्न केवल क्वेरी स्ट्रिंग से पहले एक URL के हिस्से पर लागू होना चाहिए।
मैक्स गशकोव

1

मुझे नहीं लगता कि आप वेनिला नेग्नेक्स के साथ ऐसा करने में सक्षम होंगे, लेकिन यदि आप नगीनक्स के लिए लुआ मॉड्यूल स्थापित करने के लिए तैयार हैं ( http://wiki.nginx.org/HttpLuaModule ) आप कर सकते हैं।

server {
    server_name so.dev;
    listen 80;

    location / {

        root /tmp;

        rewrite_by_lua '
            local uri = ngx.var.uri
            local params = ngx.req.get_uri_args(0)

            for key, value in pairs(params) do
                uri = string.format("%s_%s=%s", uri, key, value)
            end

            ngx.req.set_uri(uri)
            ngx.req.set_uri_args({})
        ';

    }
}

इसका स्थानीय स्तर पर परीक्षण किया गया है और ऐसा लगता है कि आप क्या देख रहे हैं। यदि आप ampersands द्वारा अलग किए गए अन्य पैरामेट्स को रखना चाहते हैं, तो rewrite_by_lua ब्लॉक को बदल दें

local uri = ngx.var.uri
local param_string = ""
local params = ngx.req.get_uri_args(0)
local separator = ""

for key, value in pairs(params) do
    param_string = param_string .. separator .. key .. "=" .. value
    separator = "&"
end

ngx.req.set_uri(uri .. "_" .. param_string)
ngx.req.set_uri_args({})

1

यह nginx / 1.6.2 पर काम करता है।

rewrite ^/.*\.php$ "${uri}_${args}";

लेकिन अगर कोई है तो व्यक्तिगत रूप से मैं try_filesमूल यूआरआई में गिरावट के साथ समाधान का उपयोग करूंगा ।

try_files $uri "${uri}_${args}";

उदाहरण के लिए, यदि आपके पास script.phpडिस्क है, तो वह पहले इसके साथ प्रयास करेगा, और फिर, यदि कोई नहीं है, तो इसके लिए जाना होगा script.php_t=12try_filesnginx के हालिया-पर्याप्त संस्करण की आवश्यकता है।

और अगर यह पर्याप्त नहीं है, तो आप इस तरह से अंदर कर सकते हैं if:

return 301 "${uri}_${args}";

मुझे यह पसंद है, लेकिन हम वास्तव में काम करने के लिए try_files बिट प्राप्त नहीं कर सकते हैं, जबकि फिर से लिखना काम करता है । (ठीक है, यदि आप ?अपने फिर से लिखना के अंत में जोड़ते हैं तो क्वेरी पैरा इसमें जोड़े नहीं जाते हैं ..)
जेफ एटवुड

@JeffAtwood try_filesको रोकने जा रहा है $uriअगर वहाँ एक स्थान ब्लॉक है कि मिलान, या इसके लिए एक फ़ाइल (बिना args के अनुरोध) - क्या यह मामला है?
AD7six

@JeffAtwood ?का स्थैतिक फ़ाइलों पर कोई प्रभाव नहीं है, आपको केवल अपने एक्सेस लॉग में एक अतिरिक्त क्वेरी दिखाई देगी; यदि आप इसके बारे में परवाह करते हैं, तो निश्चित रूप से एक प्रश्न चिह्न जोड़ें
sanmai

0

विकी का कहना है

यदि आप निर्दिष्ट करें? एक फिर से लिखना के अंत में फिर Nginx मूल $ args (तर्क) छोड़ देगा।

तो फिर rewrite ^ ${uri}_$args? last;काम करना चाहिए।


nginx उस नियम सेट के साथ पुनः आरंभ करने में विफल रहता है -rewrite ^ $uri_$args? last;
जेफ एटवुड

फिक्स्ड। $ -Bleeds-over-the-variables PHP की तरह लगता है जो मुझे पता है कि तुम सिर्फ प्यार करते हो।
chx

यहां तक ​​कि संशोधित संस्करण के साथ, नगनेक्स फिर से शुरू करने में विफल रहता है
जेफ एटवुड

0

ऊपर दिए गए जवाब काम करना चाहिए। हालाँकि आप देखते हैं कि आपका URL कितना संवेदनशील है। क्योंकि nginx यह जांचने की कोशिश करता है कि क्या फ़ाइल का नाम पहले सर्वर पर मौजूद है, कोई भी अतिरिक्त पैरामीटर इसे बंद कर देगा।

http://example.com/script.php?t=12 // works 
http://example.com/script.php?t=12&_utm=twitter // not work

मेरा सुझाव URL को छोड़ना है और इसे php के साथ सही फ़ाइल में रूट करना है। आपके पास tपैरामीटर तक पहुंच है ।

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