2013-12-09 10 views
12

पर '% 3F' और '% 3 डी' की ओर जाता है मुझे अपने सर्वर के साथ समस्या मिली है।बाहरी लिंक यूआरएल एन्कोडिंग Nginx सर्वर

myurl.com/default/Site%3Fid%3D13 

वे इस तरह दिखना चाहिए:: मैं अपने गतिशील वेब पेज के विभिन्न साइट्स के लिए चार भीतर का लिंक है जो कुछ इस तरह दिखाई मिला

myurl.com/default/Site?id=13 

मुझे पता है कि उन %3F को पलायन अनुक्रम है ? साइन और %3D बराबर चिह्न के लिए एक बच निकलना अनुक्रम है। लेकिन जब मैं उन लिंक का उपयोग करता हूं तो मुझे 400 त्रुटि मिलती है। हम इसके बारे में कैसे कर सकते हैं?

चार लिंक विभिन्न साइटों के लिए हैं, और मुझे लगता है कि समय के साथ और अधिक लिंक होंगे। तो सभी के लिए एक फिक्स सही होगा।

+0

@ जॉन सिर्फ मामले में आप भूल गए हैं और नोटिस नहीं किया था, इनाम आप सेट में समाप्त हो रहा है कुछ घंटे। –

उत्तर

8

एक ठीक उसी सवाल वास्तव में के बारे में एक साल पहले nginx-आरयू मेलिंग सूची पर कहा गया था:

http://mailman.nginx.org/pipermail/nginx-ru/2013-February/050200.html

सबसे उपयोगी प्रतिक्रिया, एक Nginx, इंक, कर्मचारी/डेवलपर द्वारा, Валентин Бартенев:

http://mailman.nginx.org/pipermail/nginx-ru/2013-February/050209.html

Если запрос приходит в таком виде, то это уже не парам тры, а имя запрошенного файла। Другое дело, что location ищется по уже раскодированному адресу, о чем в документации написано।

अनुवाद:

अनुरोध इस तरह के एक रूप में आता है, तो इन नहीं रह गया है आर्ग हैं, लेकिन अनुरोध की गई फ़ाइल का नाम है। एक और बात यह है कि, दस्तावेज के रूप में, स्थान मिलान सामान्यीकृत यूआरआई के खिलाफ किया जाता है।

उनके द्वारा सुझाए गए समाधान, अतः पर सवाल यहां से नमूना उदाहरण के लिए अनुवाद, तो होगा:

location /default/Site? { 
    rewrite \?(.*)$ /default/Site?$1? last; 
} 

location = /default/Site { 
    [...] 
} 
+0

@ जॉन और उपयोगकर्ता 3082653 - क्या मेरे उत्तर के बारे में कुछ भी है जो अस्पष्ट है या आगे स्पष्टीकरण की आवश्यकता है? – cnst

0

URL पूरी तरह से वैध है। इसमें शामिल भागने वाले पात्र बस हैं, बच निकले हैं। जो बिल्कुल ठीक है।

उद्देश्य यह है कि आप वास्तव में अनुरोध नाम (डिस्क पर फ़ाइल नाम से संबंधित अधिकांश मामलों में) Site?id=13 और Site और शेष क्वेरी स्ट्रिंग के रूप में नहीं कर सकते हैं।

मैं इसे एक फ़ाइल नाम में वर्ण रखने के लिए खराब अभ्यास मानता हूं जो इसे आवश्यक बनाता है। हालांकि, यूआरएल तर्कों में यह बहुत अच्छी तरह से आवश्यक हो सकता है।

फिर भी, अनुरोध यूआरएल मान्य है, और संभवतः आप जो चाहते हैं वह नहीं। जिसके परिणामस्वरुप सुझाव देते हैं कि जहां भी किसी ने गलत यूआरएल उठाया है, तो आपको त्रुटि को सही करना चाहिए।

मुझे वास्तव में समझ में नहीं आता कि आपको 400 त्रुटि क्यों मिली है; आपको 404 त्रुटि मिलनी चाहिए। लेकिन यह आपके सेटअप पर निर्भर करता है।

ऐसे मामले भी हैं, विशेष रूप से nginx के साथ, जो अधिकतर यूआरएल और यूआरएल भागों को कई स्तरों पर गुजरने में शामिल होते हैं (उदाहरण के लिए रिवर्स प्रॉक्सी, यूआरएल से नियमित अभिव्यक्तियों से मिलान करना और उन्हें चर के रूप में उपयोग करना आदि) जहां ऐसा एक त्रुटि हो सकती है। लेकिन इसे सत्यापित करने और इसे ठीक करने के लिए हमें आपके सेटअप के बारे में और जानना होगा।

1

निम्न नमूना सभी को गलत तरीके से दिखने अनुरोध कम गलत तरीके से दिखने वाले में, यूआरएल की परवाह किए बिना (अनुरोध किया फ़ाइल नाम — अनुरोध में %3F के रूप में एन्कोड में ? के रूप में परिभाषित) रीडायरेक्ट करेगा।

(कृपया ध्यान दें कि, कहीं और सही तरीके से सलाह दी गई है, तो आपको पहले स्थान पर इन गलत तरीके से गठित लिंक नहीं मिलना चाहिए, इसलिए इसे अंतिम उपाय — के रूप में उपयोग करें, जब आप गलत तरीके से गठित लिंक को अन्यथा सही नहीं कर सकते हैं, और क्या तुम जानते हो कि इस तरह के अनुरोध वैध एजेंटों द्वारा प्रयास किया जाता है।)

server { 
    listen  [::]:80; 
    server_name localhost; 

    rewrite  ^/([^?]*)\?(.*)$ /$1?$2?  permanent; 
    location/{ 
     return 200 "id is $arg_id\n"; 
    } 
} 

यह है कि यह कैसे — काम करेगा जब एक गलत तरीके से देख अनुरोध का सामना करना पड़ा है, सुधार का प्रयास एक माना जाता है कि सही के साथ एक 301 Moved Permanently प्रतिक्रिया के साथ किया जाता है का उदाहरण है Location प्रतिक्रिया शीर्षलेख, जो ब्राउज़र को नए प्रदान किए गए स्थान पर स्वचालित रूप से अनुरोध को फिर से जारी करेगा समझना:

opti# curl -6v "http://localhost/default/Site%3Fid%3D13" 
* About to connect() to localhost port 80 (#0) 
* Trying ::1... 
* connected 
* Connected to localhost (::1) port 80 (#0) 
> GET /default/Site%3Fid%3D13 HTTP/1.1 
> User-Agent: curl/7.26.0 
> Host: localhost 
> Accept: */* 
> 
< HTTP/1.1 301 Moved Permanently 
< Server: nginx/1.4.1 
< Date: Wed, 15 Jan 2014 17:09:25 GMT 
< Content-Type: text/html 
< Content-Length: 184 
< Location: http://localhost/default/Site?id=13 
< Connection: keep-alive 
< 
<html> 
<head><title>301 Moved Permanently</title></head> 
<body bgcolor="white"> 
<center><h1>301 Moved Permanently</h1></center> 
<hr><center>nginx/1.4.1</center> 
</body> 
</html> 
* Connection #0 to host localhost left intact 
* Closing connection #0 

ध्यान दें कि कोई सुधार के प्रयास उचित दिखने अनुरोध पर किया जाता है:

opti# curl -6v "http://localhost/default/Site?id=13" 
* About to connect() to localhost port 80 (#0) 
* Trying ::1... 
* connected 
* Connected to localhost (::1) port 80 (#0) 
> GET /default/Site?id=13 HTTP/1.1 
> User-Agent: curl/7.26.0 
> Host: localhost 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< Server: nginx/1.4.1 
< Date: Wed, 15 Jan 2014 17:09:30 GMT 
< Content-Type: application/octet-stream 
< Content-Length: 9 
< Connection: keep-alive 
< 
id is 13 
* Connection #0 to host localhost left intact 
* Closing connection #0 
संबंधित मुद्दे