2011-10-15 18 views
25

मैं अपने htaccess फ़ाइल में निम्न कोड में स्लैश यह/परीक्षण/करने के लिए। समस्या यह है कि जब मैं पर जाता हूं www.mydomain.com/test/another यह किसी अन्य पर पिछला स्लैश नहीं डालता है।.htaccess फोर्स ट्रेलिंग के पुनर्लेखन अंत है

क्या कोई जानता है कि पिछला स्लैश काम करने के लिए मेरे कोड को कैसे संशोधित करें, इससे कोई फर्क नहीं पड़ता कि यूआरएल कितना समय है?

धन्यवाद!

उत्तर

27
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301] 

संपादित: मामले में आप php फ़ाइलों के लिए की तरह कुछ अनुरोध बाहर करना चाहते हैं:

RewriteCond %{REQUEST_URI} !\.(php|html?|jpg|gif)$ 
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301] 
+1

आप सीएसएस और जेएस भी शामिल करना चाह सकते हैं। यह बहुत उपयोगी है! – Eruant

+0

@undone मई मैं पूछ सकता हूं कि एचटीएमएल के बाद क्या है? और आपने प्रश्न चिह्न के साथ 'php?' क्यों नहीं रखा? – DanFromGermany

+6

@ रेनएक्सपी में डैनफ्रॉमजर्मनी प्रश्न चिह्न इंगित करता है कि पिछले चरित्र (इस मामले में ** एल **), स्ट्रिंग में मौजूद हो सकता है या नहीं भी हो सकता है। तो इसमें ** एचटीएम ** और ** एचटीएमएल ** एक्सटेंशन दोनों शामिल हो सकते हैं! – undone

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

यह बहुत अच्छी तरह से काम करना चाहिए। यह सिर्फ यह सुनिश्चित करने के लिए जांच करता है कि पिछला चरित्र स्लैश नहीं है और एक जोड़ता है।

+0

आपका रीराइट ऊपर निम्नलिखित शर्त जोड़कर अलग कर सकें सहित सभी अनुरोधों का स्लैश कहते हैं नियम काम नहीं करता है! – undone

+2

यह अंतिम चरित्र खाता है !!! यहां ठीक है: 'रिवाइट्रूल^((। * *) [^ /]) $ $ 1/[एल, आर = 301] ' – Ajax

62

एक थोड़ा और अधिक मजबूत जवाब है, पर the answer above आधारित:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)([^/])$  /$1$2/ [L,R=301] 

RewriteCond यह सुनिश्चित करने के लिए जांच करेगा कि उस नाम के साथ कोई फ़ाइल नहीं है, और यदि नहीं, तो रिवाइटरूल करें। एक्सटेंशन की मैन्युअल सूची होने से अधिक भविष्य-सबूत!

+0

मैंने यह कोशिश की, लेकिन यह उन फ़ाइलों पर एक पिछला स्लैश जोड़ रहा है जो .html – moobot

+0

में समाप्त होते हैं यदि URL वास्तविक फ़ाइल की ओर जाता है, तो यह इस नियम को मारना नहीं चाहिए; क्या आप अनावश्यक रूप से अपने "अच्छे" यूआरएल में '.html' जोड़ रहे हैं? – jeffbyrnes

+1

मुझे नहीं, लेकिन मुझे लगता है Magento है! उत्तर के लिए धन्यवाद, हालांकि मुझे एक रीडायरेक्ट मिला जो केवल एक्सटेंशन के बिना यूआरएल में जोड़ रहा है: http://www.paulund.co.uk/using-htaccess-to-force-trailing-slash – moobot

4

जबकि Death's solution काम करता है जब आप सूची में कुछ फ़ाइल प्रकार जोड़ना भूल जाते हैं तो यह परेशान हो सकता है। आप यह उन सभी यूआरएल के पीछे पीछे हटने के लिए मजबूर कर सकते हैं जो इस स्थिति में !-f का उपयोग कर फ़ाइल पर सीधे इंगित नहीं करते हैं।

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*[^/])$ http://%{HTTP_HOST}/$1/ [L,R=301] 
+0

मैंने यह कोशिश की, लेकिन यह .html – moobot

+0

में समाप्त होने वाली फ़ाइलों पर एक पिछला स्लैश जोड़ रहा है। मैंने इसे भी आजमाया, लेकिन अभी भी sitemap.xml जैसे पृष्ठों में पिछली स्लैश को जोड़ा गया है। क्या यह संभव है कि सर्वर सेटिंग्स को डाउनलोड करने के लिए फ़ाइल के रूप में क्या देखा जाता है और ब्राउज़र में एक को प्रस्तुत किया जाए, और इससे प्रभावित होता है कि '! -f' का अर्थ कैसे लिया जाता है? – Mattypants

1

स्वीकृत उत्तर मेरे लिए काम नहीं करता था। यह SEOMoz से, आपने क्या किया:

# Ensure all URLs have a trailing slash. 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ http://www.example.com/$1/ [L,R=301] 

नोट प्रत्येक नियम के लिए RewriteBase /। कम से कम, जब मैंने इसे हटा दिया, तो यह काम करना बंद कर दिया।

+0

यह चट्टानों !! tnks – PJunior

0

यह मेरे लिए पूरी तरह से काम कर रहा है। (उपयोगकर्ता अजाक्स की टिप्पणी से)
अन्य लिंक के साथ समस्या यह मेरी सीएसएस रीडायरेक्ट नियम लागू करने के बाद काम कर बंद कर दिया लेकिन सीएसएस भी नीचे पुनर्लेखन नियम

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

पूरा कोड के साथ ठीक काम कर रहा है था

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteBase/
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_URI} !(.*)/$ 
    #Force Trailing slash 
    RewriteRule ^((.*)[^/])$ $1/ [L,R=301] 
</IfModule> 
0

यह मेरे लिए ठीक काम करता है और एक वास्तविक फाइल करने के लिए मूल्यांकन करने पर निर्भर नहीं करता, जैसा कि कुछ '-f' ध्वज का सुझाव दिया है:

RewriteCond %{REQUEST_URI} !\.[a-z0-9]+$ [NC] 
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301] 
0

ऊपर दिए गए उदाहरण मेरे लिए काम नहीं करते थे, नियम के अंत में मजबूर स्लैश के लिए धन्यवाद, उदा। $ 1 $ 2 /।

मेरे लिए यह काम किया (मैंने इसे WordPress के लिए उपयोग किया और HTTPS पर रीडायरेक्ट किया)।तुम बस RewriteEngine और RewriteBase लाइनों के पीछे हालत और नियम लाइनों को जोड़ने के लिए है:

# BEGIN WordPress 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/

# I added these two lines for redirect to HTTPS 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L] 

RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 
# END WordPress` 
-3
<rule name="Remove trailing slash" stopProcessing="true"> 
    <match url="^([^.]+)/$" /> 

अपने कॉन्फ़िग फ़ाइल में इस नियम को जोड़ सकते हैं और मुझे

+0

<नियम नाम = "पिछला स्लैश निकालें" stopProcessing = "true">

+0

टिप्पणी करने के बजाय आपको अपने उत्तर में कोड की पंक्ति जोड़नी चाहिए यह – Timothy

0

स्लैश बाध्य करने के लिए के लिए यह काम कर रहा है, तो आप mod-dir मॉड्यूल है कि चलाता है

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R] 

नोट से पहले mod-rewrite स्वचालित रूप से स्लैश कहते हैं जब यह एक के लिए एक अनुरोध देखता है: उपयोग कर सकते हैं n existant dir, इसलिए हमें नियमों से निर्देशिका को बाहर करना होगा अन्यथा कुछ सर्वरों पर RewriteCond %{REQUEST_FILENAME} !-d के बिना नियम का उपयोग करना, आप /dir// पर समाप्त हो जाएंगे या यदि आपने निर्देशिका स्लैश बंद कर दिया है तो यह समस्याएं पैदा कर सकता है।

नियम से ऊपर विस्तार के साथ फ़ाइलें, यदि आप न स्लैश के साथ अपनी फ़ाइलें, तो आप उन्हें नियम

RewriteCond %{REQUEST_FILENAME} !-f 
संबंधित मुद्दे