एक htaccess नियम पता नहीं कर सकते


9

मैं अपने htaccess में यह है, लेकिन इसके लिए क्या पता कर सकते हैं। नियम की प्रकृति के कारण, खोज करने से कोई मदद नहीं मिलती है।

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

किसी को भी कृपया बता सकते हैं कि इसके लिए क्या है?


यदि अनुरोध भाग (".com" के बाद URL का भाग) के साथ समाप्त नहीं होता है /और इसमें " ." नहीं है, तो अनुरोध को एक के साथ जोड़कर पुनर्निर्देशित करें /। इस नियम का संभावित उद्देश्य स्वचालित निर्देशिका अनुक्रमण को संभालना है।
पेटेर -

जवाबों:


11

सभी इस नियम करता पीछे जोड़ने के लिए है /अपने URL में अगर वहाँ कोई भी है और अगर कोई है .यूआरआई में है, इसलिए https://example.org/testपर पुनः निर्देशित किया जाएगा https://example.org/test/, लेकिन https://example.org/test.htmlफिर से लिखा नहीं किया जाएगा https://example.org/test.html/(लेकिन ध्यान दें: https://example.org/test.case/folderयह भी होगा नहीं पर पुनः निर्देशित किया https://example.org/test.case/folder/के रूप में यह होता है एक .URI में)।

## Do the following if the URI does not end with `/` or  does not contain an `.`: 
## the . is relevant for file names like test.html, which should n 
RewriteCond %{REQUEST_URI} !(/$|\.)

## Redirect it to the original URI with an added `/` and mark this as permanent:
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

" /test.case/folderभी रीडायरेक्ट नहीं किया जाएगा" - माइनर पॉइंट, लेकिन अगर "फ़ोल्डर" एक फाइलसिस्टम डायरेक्टरी है, तो mod_dir विल (डिफ़ॉल्ट रूप से) 301 रीडायरेक्ट को एक अनुगामी स्लैश को जोड़ने के लिए जारी करेगा। यह केवल एक मुद्दा है अगर यह है /test.case/some-other-virtual-urlकि एक अनुगामी स्लेश होना चाहिए।
MrWhite

6

सत्यापन के बिना, लेकिन अपाचे पुनर्लेखन में मेरे अनुभव का उपयोग करते हुए, यह कॉन्फ़िगरेशन निम्न प्रतीत होता है:

  1. URI (सर्वर, पोर्ट या क्वेरी पैरामीटर नहीं) के 'पथ' भाग पर मेल करें, उदाहरण के लिए '/my/location/file.html'।
  2. यदि यह भाग '/' (फ़ॉरवर्ड-स्लैश) वर्ण पर समाप्त नहीं होता है, तो, -या- इसमें a 'शामिल नहीं है।' (डॉट) चरित्र।
  3. URI के पूर्ण पथ भाग का उपयोग करें और इसे अग्रेषित-स्लैश में जोड़ें।
  4. इस नए URI के लिए ब्राउज़र को निर्देशित करने के लिए एक HTTP 301 (स्थायी) रीडायरेक्ट भेजें।

यह निम्नलिखित परीक्षण मामलों में परिणाम देगा

/ -> / /test -> /test/ /my/resource -> /my/resource/ /my/resource.type -> /my/resource.type /edge.case/resource -> /edge.case/resource

इसलिए मुझे लगता है कि नियम में संसाधनों को जोड़ने के उद्देश्य हैं जो एक फाइल नहीं लगती हैं, लेकिन ऐसा लगता है कि यह एक किनारे का मामला है।

अगर एक संसाधन के साथ स्लैश नहीं जोड़ा जा रहा है '।' पथ के गैर-फ़ाइल हिस्से में (डॉट) चरित्र को नियमित अभिव्यक्ति में बदलना चाहिए:

# match paths which do not end with a slash, or do not resemble a file with an extension
RewriteCond %{REQUEST_URI} !(/$|\.[^/]+$)
# redirect permanently to the same uri with a slash
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

!(\/$|\.[^\/]*)- आपका अपडेटेड रेगेक्स वास्तव में अलग नहीं है। आपको दूसरे भाग पर (जो कि विस्तार से मेल खाता है) एंड-एंड-स्ट्रिंग लंगर की आवश्यकता है। शायद कुछ इस तरह: !(/|\.[a-zA-Z]+)$(स्लैश से बचने की आवश्यकता नहीं)।
MrWhite

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