2013-07-02 12 views
10

मैं nginx 1.4.1 के लिए निम्न विन्यास का उपयोग कर रहा पारित:nginx और प्रॉक्सी के साथ स्लैश

 
server { 
    listen  8000; 
    server_name correct.name.gr; 

    location /test/register { 
     proxy_set_header X-Forwarded-Host $host; 
     proxy_set_header X-Forwarded-Server $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_pass http://127.0.0.1; 
    } 
} 

जब उन http://correct.name.gr:8000/test/register/ vist वे अपाचे जो पर चलता है करने के लिए प्रॉक्सी किया जाना चाहिए मुझे क्या करना चाहते है पोर्ट 80.

जब मैं http://correct.name.gr:8000/test/register/ पर जाता हूं तो मुझे सही परिणाम मिलते हैं (index.php)। जब मैं http://correct.name.gr:8000/test/register/asd पर जाता हूं तो मुझे सही परिणाम मिलते हैं (अपाचे से 404)। जब मैं http://correct.name.gr:8000/test/asd पर जाता हूं तो मुझे सही परिणाम मिलते हैं (nginx से 404)। जब मैं http://correct.name.gr:8000/test/register123 पर जाता हूं तो मुझे सही परिणाम मिलते हैं (अपाचे से 404)।

समस्या तब होती है जब मैं http://correct.name.gr:8000/test/register पर जाता हूं। मुझे 301 प्रतिक्रिया मिलती है और मुझे http://localhost/test/register/ पर रीडायरेक्ट किया जाता है (पिछली स्लैश और निश्चित रूप से 'लोकलहोस्ट') पर ध्यान दें !!!

मैंने पिछली स्लैश या कुछ समान रखने के लिए nginx को कोई अन्य कॉन्फ़िगरेशन नहीं किया है। क्या आप जानते हैं कि समस्या क्या है? मैं http://correct.name.gr:8000/test/register को अपाचे से प्रॉक्सी करने के लिए सही तरीके से काम करना चाहता हूं (या कम से कम 404 त्रुटि जारी करने के लिए संभव नहीं है और उपयोगकर्ता के लोकहोस्ट पर रीडायरेक्ट नहीं है)।

अद्यतन 1: मैं जिसके साथ मैं कल बुरा व्यवहार किया था की तुलना में एक अलग कंप्यूटर से http://correct.name.gr:8000/test/register की कोशिश की .. खैर, यह काम किया: मैं बस एक 301 प्रतिक्रिया है कि मुझे सही http://correct.name.gr:8000/test/register/ की ओर इशारा किया गया है! एक कंप्यूटर से काम करना कैसे संभव है लेकिन दूसरे से नहीं (मैं एक ही ब्राउज़र का उपयोग कर रहा हूं-क्रोम दोनों कंप्यूटरों में)? व्यवहार को देखने के लिए मैं तीसरे व्यक्ति से परीक्षण करने के लिए कल फिर कोशिश करूंगा।

धन्यवाद!

उत्तर

3

मेरा अनुमान है कि आपका अपस्ट्रीम सर्वर (या तो अपाचे या आपकी स्क्रिप्ट) ने पूर्ण यूआरएल http://localhost/test/register/ पर रीडायरेक्ट ट्रिगर किया है। क्योंकि आप http://127.0.0.1 का उपयोग अपने proxy_pass निर्देश में करते हैं, nginx को डोमेन नाम का मिलान नहीं मिलता है और Location शीर्षलेख देता है।

मुझे लगता है कि सही समाधान एक रीडायरेक्ट का उपयोग नहीं करना है यदि रीडायरेक्ट एक आंतरिक यूआरएल है। यह हमेशा एक अच्छा अभ्यास है।

हालांकि, अपस्ट्रीम सर्वर को बदलने के बिना, दो त्वरित समाधान हैं।

आप

proxy_pass http://localhost; 

उपयोग कर सकते हैं nginx नदी के ऊपर का डोमेन नाम localhost है यह बता देंगे। फिर http://correct.name.gr:8000 द्वारा nginx को Location हेडर में उस हिस्से को अपस्ट्रीम से प्राप्त करने के बारे में पता चल जाएगा।

कोई अन्य proxy_redirect लाइन जोड़ने के लिए http://localhost/ के साथ किसी भी स्थान शीर्षलेख को फिर से लिखने के लिए nginx को मजबूर करने के लिए है।

proxy_pass http://127.0.0.1; 
proxy_redirect http://localhost/ /; 

मैं पहला समाधान पसंद करता हूं क्योंकि यह आसान है। proxy_pass http://localhost; का उपयोग करने के लिए कोई DNS लुकअप ओवरहेड नहीं है क्योंकि वेब सर्वर शुरू होने पर nginx अग्रिम में लुकअप करता है।

संदर्भ: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

1

क्या आप पहले से ही server_name_in_redirect के साथ खेलने का प्रयास कर चुके हैं?

हालांकि, मुझे आपको Google के माध्यम से प्रश्न मिला क्योंकि मैं पिछली स्लैश के साथ एक ही समस्या चलाता हूं। Nginx एक यूआरएल पर के साथ एक पिछला स्लैश के साथ 301 को मजबूर करता है।

+0

नहीं, मैं उस के साथ खेल रहा है की कोशिश नहीं की ... मैं कल करेगा - हालांकि अद्यतन पर एक नज़र डालें कृपया – Serafeim

+1

बस किसी भी ब्राउज़र कैशिंग दुष्प्रभाव से बचने के लिए, मैं नहीं बल्कि इन रीडायरेक्ट जांच करने की अनुशंसा करेंगे एक खोल से कर्ल के साथ: "curl -IL http://correct.name.gr:8000/test/register" – vreen

+0

हाँ, बहुत अच्छी टिप्पणी ... कर्ल एफटीडब्ल्यू! – Serafeim

संबंधित मुद्दे