Htaccess: URL से अनुगामी स्लैश जोड़ें / निकालें


82

मेरी वेबसाइट पर एक स्क्रिप्ट चलती है -> WSS वॉलपेपर स्क्रिप्ट

मेरी समस्या -> मैं डुप्लिकेट सामग्री को रोकने और अपने URL को साफ़ करने के लिए अपने URL के अंत में ट्रेसिंग स्लैश को हटाने या जोड़ने की कोशिश कर रहा हूँ।

मैंने हर तरह की कोशिश की है और उन सभी चीजों की कोशिश की है जो मैं इंटरवेब से सोच सकता हूं और लोड कर सकता हूं लेकिन अभी तक ऐसा कोई भाग्य नहीं है! यह एक त्वरित सुधार हो सकता है, लेकिन मैंने इस पर बहुत गौर किया है कि मैं स्पष्ट रूप से मृत कुछ के लिए अंधा हूं।

इसलिए मैं आपको अपने सभी .htaccessकोड के साथ प्रस्तुत करता हूं :

DirectoryIndex index.php

RewriteEngine on
RewriteRule ^download/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+) image.php?id=$1&width=$2&height=$3&cropratio=$4&download=1 [L]
RewriteRule ^file/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+) image.php?id=$1&width=$2&height=$3&cropratio=$4 [L]
RewriteRule ^preview/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+) wallpaper_preview.php?id=$1&width=$2&height=$3&name=$4 [L]
RewriteRule ^thumbnail/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/]+) image.php?wallpaper_id=$1&width=$2&height=$3&cropratio=$4&align=$5&valign=$6&file=$7 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+)/p([0-9]+) index.php?task=category&id=$1&name=$2&page=$3 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+)/([0-9a-zA-Z?-]+)/p([0-9]+) index.php?task=category&id=$1&name=$2&sortby=$3&page=$4 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+)/([0-9a-zA-Z?-]+)-([0-9]+) index.php?task=category&id=$1&sortby=$3&page=$4 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+) index.php?task=category&id=$1&name=$2 [L]
RewriteRule ^tag/([^/\.]+)/([0-9a-zA-Z?-]+)/([0-9]+) index.php?task=tag&t=$1&sortby=$2&page=$3 [L]
RewriteRule ^tag/([^/\.]+) index.php?task=tag&t=$1 [L]
RewriteRule ^profile/([0-9]+)?/([^/\.]+) index.php?task=profile&id=$1&name=$2 [L]
RewriteRule ^profile/comments/([0-9]+)?/([^/\.]+) index.php?task=users_comments&id=$1&name=$2 [L]
RewriteRule ^page/([0-9]+) index.php?task=view_page&id=$1 [L]  
RewriteRule ^register index.php?task=register [L] 
RewriteRule ^lost-password index.php?task=lost_pass [L] 
RewriteRule ^links index.php?task=links [L]
RewriteRule ^news/item/([0-9]+)/([^/\.]+) index.php?task=news&id=$1 [L]
RewriteRule ^news/page([0-9]+) index.php?task=news&page=$1 [L]
RewriteRule ^members/([^/\.]+)-([^/\.]+)/page([0-9]+)? index.php?task=member_list&sort=$1&order=$2&page=$3 [L]
RewriteRule ^members index.php?task=member_list [L]
RewriteRule ^messages index.php?task=messages [L]
RewriteRule ^submit index.php?task=submit [L]
RewriteRule ^search/([^/\.]+) index.php?task=search&q=$1 [L]
RewriteRule ^search index.php?task=search [L]
RewriteRule ^submit index.php?task=submit [L]
RewriteRule ^r-([0-9]+)?-([0-9]+)? go.php?id=$1&ref=$2 [L]
RewriteRule ^r-([0-9]+)? go.php?id=$1 [L]
RewriteRule ^([^/\.]+)/([0-9]+)/([^/\.]+) index.php?task=view&id=$2&name=$3 [L]
RewriteRule ^news/([^/\.]+) index.php?task=news&name=$1 [L]
RewriteRule ^profile/([^/\.]+) index.php?task=profile&name=$1 [L]
RewriteRule ^news index.php?task=news [L]
RewriteRule ^page/([^/\.]+) index.php?task=view_page&name=$1 [L]  
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([0-9a-zA-Z'?-]+)/([0-9]+) index.php?task=category&name=$1&sortby=$2&page=$3 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([^/\.]+) index.php?task=view&name=$2 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+) index.php?task=category&name=$1 [L]


## www reslove ##
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
## www reslove ##

## index reslove ##
Options +FollowSymLinks
RewriteCond %{THE_REQUEST} ^.*/index\.php
RewriteRule ^(.*)index.php$ http://www.epicwallpaper.net/$1 [R=301,L]
## index reslove ##

1
इसके अलावा, यदि कोई बुरा लड़का ठीक कर सकता है तो क्या आप यहां उत्तर दे सकते हैं धन्यवाद
ल्यूक

कृपया यहाँ कोड पोस्ट करें।
सुरियल ड्रीम्स

1
अपनी पोस्ट को संपादित करें, अपने कोड को अपनी पोस्ट में पेस्ट करें, इसे हाइलाइट करें, कोड के रूप में प्रारूपित करने के लिए "CTRL + K" दबाएँ
जॉन लिन

क्या आपके पास वास्तव में है या ? आपके URI में अनुमति है? रेवेरिट्यूल्स (नीचे के पास) में से एक ऐसा सुझाव देता है। मुझे चिंता है कि वे सर्वर को भ्रमित कर सकते हैं।
फिल पेरी

जवाबों:


199

RewriteEngine Onपंक्ति के ठीक नीचे , जोड़ें:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R] # <- for test, for prod use [L,R=301]

नो-ट्रेलिंग-स्लैश पॉलिसी लागू करना।

अनुगामी-स्लेश नीति लागू करने के लिए:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ /$1/ [L,R] # <- for test, for prod use [L,R=301]

संपादित करें : R=301भागों पर टिप्पणी की , क्योंकि एक टिप्पणी में बताया गया है:

उस से सावधान रहेंR=301 ! इसके होने से कई ब्राउज़र कैश .htaccess-file को अनिश्चित काल के लिए कैश कर देते हैं : यह किसी भी तरह अपरिवर्तनीय हो जाता है यदि आप इसे खोलने वाली सभी मशीनों पर ब्राउज़र-कैश को साफ़ नहीं कर सकते हैं। जब परीक्षण, बेहतर सरल Rया के साथ जानाR=302

अपने परीक्षण पूरा करने के बाद, आप उपयोग कर सकते हैं R=301


4
भगवान मैं तुम्हें चूम सकता है! एक नो-ट्रेलिंग-स्लैश को लागू करने के साथ काम किया, दूसरे ने मुझे 500 सर्वर त्रुटि दी धन्यवाद जॉन लिन!
ल्यूक

22
यदि वेबसाइट एक निर्देशिका में स्थित है (जैसे example.org/blog/)
No-

8
उस से सावधान रहें R=301! इसके होने से कई ब्राउज़र कैश .htaccess-file को अनिश्चित काल के लिए कैश कर देते हैं: यह किसी भी तरह अपरिवर्तनीय हो जाता है यदि आप इसे खोलने वाली सभी मशीनों पर ब्राउज़र-कैश को साफ़ नहीं कर सकते हैं। परीक्षण करते समय, बेहतर "आर" या "आर = 302" के साथ जाएं
जोनाथन वेबर

जब VirtualDocumentRoot बंद होता है, तो शुरुआत में स्लैश को हटा दें, अर्थात: @, @Jonathanber के $1बजाय /$1, .htaccess फ़ाइल नहीं परोसी जाती है, लेकिन समय सीमा समाप्त हो जाती है, जो ब्राउज़र को बताती है कि संसाधन को कितने समय के लिए कैश करना है।
दो बार

1
@Nrc क्योंकि फ़ाइलों और निर्देशिकाओं के अलावा अन्य प्रकार के मैपिंग भी हैं, और यह भी मौका है कि न तो फ़ाइल और न ही निर्देशिका के लिए एक अनुरोध मानचित्र को फिर से लिखना होगा। नकारात्मक यह सुनिश्चित करता है कि कुछ ऐसा जो फिर से लिखा गया है या पहले से ही फाइलसिस्टम में किसी चीज के नक्शे को छोड़ दिया गया है।
जॉन लिन

84

जॉन लिन के जवाब को पूरक करने के लिए, यहां एक नो-ट्रेलिंग-स्लैश तकनीक है जो वेबसाइट के एक निर्देशिका में स्थित होने पर भी काम करती है (जैसे example.org/blog/):

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [R=301,L]


पूर्णता के लिए, यहां एक विकल्प पर जोर दिया गया है जो REQUEST_URIस्लैश से शुरू होता है (कम से कम .htaccessफाइलों में):

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /(.*)/$
RewriteRule ^ /%1 [R=301,L] <-- added slash here too, don't forget it

बस उपयोग नहीं करते %{REQUEST_URI} (.*)/$ । क्योंकि रूट डाइरेक्टरी में REQUEST_URIसमान /स्लैश होता है, और इसे गलत स्लैश के रूप में गलत समझा जाएगा।


यदि आप अधिक पढ़ने में रुचि रखते हैं:

(अपडेट: यह तकनीक अब लारवेल 5.5 में लागू हो गई है)


1
विशेष रूप से आधुनिक URL सम्मेलनों का उपयोग करते समय यह विशेष रूप से उपयोगी है। आशा है कि आप बुरा नहीं मानेंगे, मैं इसे htaccess स्निपेट रिपॉजिटरी में जमा कर रहा हूँ ।
एलेक्सव

1
यह समस्या तब समाप्त होती है जब REQUEST_URI (रूट) की व्याख्या एक अनुगामी स्लैश के रूप में की जाती है जिससे एक अनंत लूप भी उत्पन्न होता है। धन्यवाद
रुस्लान अबुजेंट

हाँ, स्वीकृत उत्तर वेबसाइट के एक निर्देशिका में स्थित होने पर हाथ नहीं देता है, लेकिन यह उत्तर RewriteCond %{REQUEST_URI} (.+)/$सिर्फ एक अंतिम अनुगामी स्लैश को हटाता है (जैसे कि sth /// से sth // से sth / sth तक) के लिए आवश्यक कई पुनर्निर्देश। एक पुनर्निर्देशन में सभी अनुगामी स्लैश को हटाने के लिए बेहतर समाधान का उपयोग करेंRewriteCond %{REQUEST_URI} (.+?)/+$
11:00

1
मैंने भी इस बारे में सोचा था। हालांकि, परिणाम सही है, और इसे एक किनारे का मामला मानते हुए, मैंने कोड सादगी को प्राथमिकता दी।
ग्रास डबल

@GrasDouble, धन्यवाद आप लंबे समय से इस समाधान की तलाश कर रहे हैं। अनगिनत तरीके आजमाए लेकिन आपका काम ठीक रहा! बहुत - बहुत धन्यवाद।

3

यह वही है जो मैंने अपने नवीनतम ऐप के लिए उपयोग किया है।

# redirect the main page to landing
##RedirectMatch 302 ^/$ /landing

# remove php ext from url
# /programming/4026021/remove-php-extension-with-htaccess
RewriteEngine on 

# File exists but has a trailing slash
# /programming/21417263/htaccess-add-remove-trailing-slash-from-url
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.*)/+$ /$1 [R=302,L,QSA]

# ok. It will still find the file but relative assets won't load
# e.g. page: /landing/  -> assets/js/main.js/main
# that's we have the rules above.
RewriteCond %{REQUEST_FILENAME} !\.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^/?(.*?)/?$ $1.php

1
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
## hide .html extension
# To externally redirect /dir/foo.html to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+).html
RewriteRule ^ %1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)/\s
RewriteRule ^ %1 [R=301,L]

## To internally redirect /dir/foo to /dir/foo.html
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^\.]+)$ $1.html [L]


<Files ~"^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>

यदि आप इसे पूरक करते हैं तो यह html कोड या php को हटा देता है। आप अनुगामी स्लैश को जोड़ने की अनुमति देता है और यह 404 कोड को दरकिनार करते हुए अनुगामी स्लैश के बिना url के साथ आता है। साथ ही थोड़ी अतिरिक्त सुरक्षा।


हाय, आप यह कैसे लिखेंगे nginx के लिए? मैंने इसे यहां एक कन्वर्टर में चलाने की कोशिश की: विंगिनएक्स . com / en / htaccess लेकिन यह परिणाम मुझे अनंत लूप देता है:# nginx configuration location / { rewrite ^(.*)$ /%1 redirect; rewrite ^(.*)$ /%1 redirect; rewrite ^/([^\.]+)$ /$1.html break; } location ~ ^.*\.([Hh][Tt][Aa]) { deny all; }
Asle
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.