"^ // (। *)" के लिए रिवर्ट्युल क्यों करता है (डबल स्लैश से शुरू होता है) एक स्लैश में रीडायरेक्ट नहीं करता है?

Aug 17 2020

इस नियम को vHost संदर्भ में लिखें। लेकिन यह उन अनुरोधों को फिर से नहीं लिखता है जो //.*(डबल स्लैश) से शुरू होते हैं । बस उन्हें /.*पुनर्निर्देशित करने के बजाय (एकल स्लैश) से जवाब देने की सेवा करता है/.*

RewriteRule "^//(.*)" "/$1" [R=301,L]

यह काम क्यों नहीं करता है?

जवाब

2 MrWhite Aug 18 2020 at 06:51
RewriteRule "^//(.*)" "/$1" [R=301,L]

यह कभी भी मेल नहीं खाएगा, क्योंकि जिस URL-पथ के विरुद्ध RewriteRule प्रतिमान मेल खाता है, उसमें पहले से ही एक स्लैश में कई स्लैश घट गए हैं।

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

उदाहरण के लिए, URL-पथ पर एक ही स्लैश में कई स्लैश के सभी उदाहरणों को पुनर्निर्देशित करने के लिए, न केवल शुरुआत में, फिर आप कुछ इस तरह से कर सकते हैं:

RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule (.*) $1 [R=301,L]

Regex \s[^?]*//यह सुनिश्चित करता है कि हम URL के क्वेरी स्ट्रिंग भाग में कई स्लैश से मेल नहीं खाते (जो अन्यथा अनुप्रेषित लूप में परिणाम देगा)।


क्या RewriteCond %{THE_REQUEST} ^//हम केवल उन लोगों के लिए पुनर्लेखन नियम लागू करने की अनुमति देंगे जो दोहरे स्लैश के अन्य सभी उदाहरणों को अनदेखा करते हुए डबल स्लैश से शुरू करते हैं?

बिल्कुल नहीं, THE_REQUESTसर्वर चर में वास्तव में HTTP अनुरोध हेडर की पूरी पहली पंक्ति होती है। दूसरे शब्दों में, प्रपत्र की एक स्ट्रिंग:

GET /foo/bar.html HTTP/1.1

या GET //foo/bar.html HTTP/1.1यदि URL-पाथ की शुरुआत में डबल स्लैश है, तो आपको इसके बजाय कुछ इस तरह की आवश्यकता होगी:

RewriteCond %{THE_REQUEST} \s//[^/]
RewriteRule (.*) $1 [R=301,L]

... सभी अनुरोध विधियों को पकड़ने के लिए। और विशेष रूप से केवल एक डबल स्लैश, ट्रिपल स्लैश नहीं, केवल URL-पथ की शुरुआत में।

\s//[^/]- यह एक स्थान है ( अनुरोध विधि के बाद ) 2 स्लैश के बाद और स्लैश के अलावा कुछ (यानी या तो दस्तावेज़ रूट, या कुछ अन्य URL-पथ के लिए एक स्थान )।