अपाचे mod_rewrite
आप जो खोज रहे हैं वह mod_rewrite है ,
विवरण: मक्खी पर अनुरोधित URL को फिर से लिखने के लिए एक नियम-आधारित पुनर्लेखन इंजन प्रदान करता है।
आम तौर पर बोलना, mod_rewrite
निर्दिष्ट नियमित अभिव्यक्तियों के खिलाफ अनुरोधित दस्तावेज़ के मिलान से काम करता है, फिर आंतरिक रूप से (अपाचे प्रक्रिया के भीतर) या बाहरी रूप से (क्लाइंट ब्राउज़र में) URL रीराइट करता है। ये rewrites आंतरिक रूप से example.com/ के अनुवाद के लिए सरल हो सकते हैं।
अपाचे डॉक्स में एक mod_rewrite
गाइड शामिल है और मुझे लगता है कि कुछ चीजें जो आप करना चाहते हैं, वे इसमें शामिल हैं। विस्तृत mod_rewrite गाइड ।
www
उपडोमेन को फोर्स करें
मैं चाहूंगा कि हर url से पहले "www" को लागू किया जाए, इसलिए इसका domain.com नहीं बल्कि www.domain.com/page है
रेनिट गाइड में कैन्यनियल होस्टनाम उदाहरण के तहत इसके लिए निर्देश शामिल हैं ।
ट्रेलिंग स्लैश निकालें (भाग 1)
मैं पृष्ठों से सभी अनुगामी स्लैश को निकालना चाहूंगा
मुझे यकीन नहीं है कि आप ऐसा क्यों करना चाहते हैं क्योंकि फिर से लिखना गाइड में सटीक विपरीत के लिए एक उदाहरण शामिल है , अर्थात, हमेशा ट्रैश स्लैश सहित। डॉक्स का सुझाव है कि ट्रेलिंग स्लैश को हटाने से मुद्दों को पैदा करने की बहुत संभावना है:
ट्रेलिंग स्लैश समस्या
विवरण:
हर वेबमास्टर URL के संदर्भ निर्देशिकाओं पर अनुगामी स्लैश की समस्या के बारे में एक गीत गा सकता है। यदि वे अनुपलब्ध हैं, तो सर्वर में कोई त्रुटि है, क्योंकि यदि आप /~quux/foo
इसके बजाय कहते हैं, /~quux/foo/
तो सर्वर foo नामक फ़ाइल को खोजता है। और क्योंकि यह फ़ाइल एक निर्देशिका है जो इसकी शिकायत करती है। वास्तव में यह ज्यादातर मामलों में इसे स्वयं ठीक करने की कोशिश करता है, लेकिन कभी-कभी इस तंत्र को आपके द्वारा अनुकरण करने की आवश्यकता होती है। उदाहरण के लिए, आपने सीजीआई लिपियों आदि के लिए बहुत से जटिल URL पुनर्लेखन किए हैं।
शायद आप इस बात का विस्तार कर सकते हैं कि आप हर समय ट्रेलिंग स्लैश को क्यों हटाना चाहते हैं?
.php
एक्सटेंशन निकालें
मुझे .php को निकालने के लिए इसकी आवश्यकता है
ऐसा करने के लिए निकटतम चीज जो मैं सोच सकता हूं कि प्रत्येक .php एक्सटेंशन के साथ प्रत्येक अनुरोध दस्तावेज़ को आंतरिक रूप से फिर से लिखना है, उदाहरण के लिए। उदाहरण के रूप में इसके बजाय संसाधित किया जाता है। ध्यान दें कि इस तरीके से आगे बढ़ने के लिए यह आवश्यक होगा कि प्रत्येक पृष्ठ वास्तव में फाइलपेज पर मौजूद है।
नियमित अभिव्यक्तियों के सही संयोजन के साथ यह कुछ हद तक संभव होना चाहिए। हालाँकि, मैं कुछ संभावित मुद्दों को अनुक्रमणिका पृष्ठों के साथ ठीक से अनुरोध नहीं किया जा रहा है और निर्देशिकाओं का सही मिलान नहीं कर रहा हूँ।
उदाहरण के लिए, यह example.com/test.php के लिए अनुरोध के रूप में example.com/test को सही ढंग से फिर से लिखेगा:
RewriteEngine on
RewriteRule ^(.*)$ $1.php
लेकिन example.com को लोड करने में विफल हो जाएगा क्योंकि कोई example.com/.php नहीं है
मैं यह अनुमान लगाने जा रहा हूं कि यदि आप सभी अनुगामी स्लैश निकाल रहे हैं, तो मूल निर्देशिका में फ़ाइल नाम के लिए एक अनुरोध सूची निर्देशिका के लिए अनुरोध करना लगभग असंभव हो जाएगा। आप निर्देशिका 'फ़ॉबर' के लिए अनुरोध का निर्धारण कैसे करते हैं:
example.com/foobar
फाइल के लिए एक अनुरोध से जिसे फोबार कहा जाता है (जो वास्तव में फोबार है। एफपी)
example.com/foobar
यह संभव हो सकता है यदि आप RewriteBase
निर्देश का उपयोग करते हैं । लेकिन अगर आप ऐसा करते हैं, तो यह समस्या और अधिक जटिल हो जाती है, क्योंकि यदि आप RewriteCond
किसी निर्देशिका या फ़ाइल के लिए अनुरोध मैप करते हैं, तो आपको फ़ाइल स्तर की जाँच करने के लिए निर्देश की आवश्यकता होगी ।
उस ने कहा, यदि आप सभी ट्रेलिंग स्लैश को हटाने की अपनी आवश्यकता को हटा देते हैं और इसके बजाय "एड। Thepp एक्सटेंशन" समस्या को बलपूर्वक जोड़ते हैं, तो समस्या थोड़ी अधिक वाजिब हो जाती है।
# Turn on the rewrite engine
RewriteEngine on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]
यह अभी भी सही नहीं है - एक फ़ाइल के लिए प्रत्येक अनुरोध अभी भी .php अनुरोध में आंतरिक रूप से जोड़ा गया है। 'Hi.txt' के लिए एक अनुरोध यह आपकी त्रुटि लॉग में डाल देगा:
[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat
लेकिन एक और विकल्प है, इस तरह DefaultType
और DirectoryIndex
निर्देश सेट करें:
DefaultType application/x-httpd-php
DirectoryIndex index.php index.html
अद्यतन 2013-11-14 - निकोर्लियस के अवलोकन को शामिल करने के लिए उपरोक्त स्निपेट को निर्धारित किया गया
अब hi.txt (और कुछ भी) के लिए अनुरोध सफल हैं, example.com/test के लिए अनुरोध test.php के संसाधित संस्करण को वापस कर देंगे, और index.php फाइलें फिर से काम करेंगी।
जहाँ क्रेडिट इस समाधान के लिए कारण है के रूप में मुझे मिल गया मैं श्रेय देना चाहिए माइकल जे Radwins ब्लॉग के लिए गूगल खोज के द्वारा php कोई विस्तार अपाचे ।
ट्रेलिंग स्लैश निकालें
कुछ खोज apache remove trailing slashes
मुझे कुछ खोज इंजन अनुकूलन पृष्ठों पर लाया। जाहिरा तौर पर कुछ कंटेंट मैनेजमेंट सिस्टम (इस मामले में Drupal) URls में एक अनुगामी स्लैश के साथ और बिना सामग्री उपलब्ध कराएंगे, जो कि SEO की दुनिया में आपकी साइट को डुप्लिकेट कंटेंट जुर्माना लगाने के लिए प्रेरित करेगा। स्रोत
समाधान काफी तुच्छ लगता है, mod_rewrite
हम उस स्थिति पर फिर से लिखते हैं जो अनुरोधित संसाधन में समाप्त होता है /
और 301 Permanent Redirect
HTTP हेडर वापस भेजकर URL को फिर से लिखना होता है ।
यहाँ उसका उदाहरण है जो मानता है कि आपका डोमेन blamcast.net है और अनुरोध को वैकल्पिक रूप से उपसर्ग करने की अनुमति देता है www.
।
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
अब हम कहीं जा रहे हैं। आओ इसे एक साथ रखें और देखें कि यह कैसा दिखता है।
अनिवार्य www.
, नहीं .php
, और कोई अनुगामी स्लैश नहीं
यह मानता है कि डोमेन phobar.com है और यह मानक पोर्ट 80 पर चल रहा है।
# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html
# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST} !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST} !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*) http://www.foobar.com/$1 [L,R,NE]
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
'आर' ध्वज को RewriteRule
निर्देश अनुभाग में वर्णित किया गया है । स्निपेट:
redirect|R [=code]
(बल पुनर्निर्देशन) उपसर्ग प्रतिस्थापन
http://thishost[:thisport]/
(जो नए URL को URI बनाता है) बाहरी पुनर्निर्देशन के लिए बाध्य करता है। यदि कोई कोड नहीं दिया गया है, तो 302 ( MOVED TEMPORARILY ) का HTTP प्रतिसाद दिया जाएगा।
अंतिम नोट
मैं सफलतापूर्वक काम करने के लिए स्लैश हटाने में सक्षम नहीं था। पुनर्निर्देशन ने मुझे अनंत अनुप्रेषित छोर दिए। मूल समाधान को करीब से पढ़ने के बाद मुझे यह आभास मिलता है कि ऊपर का उदाहरण उनके लिए काम करता है क्योंकि उनका ड्रुपल इंस्टॉलेशन कैसे कॉन्फ़िगर किया गया है। वह विशेष रूप से उल्लेख करता है:
एक सामान्य Drupal साइट पर, स्वच्छ URL सक्षम होने के साथ, ये दोनों पते मूल रूप से विनिमेय हैं
स्लैश के साथ और उसके बिना समाप्त होने वाले URL के संदर्भ में। इसके अलावा,
Drupal .htaccess
आपके वेब सर्वर को URL को हैंडल करने का तरीका बताने के लिए एक फ़ाइल का उपयोग करता है । यह वही फाइल है जो Drupal के क्लीन URL मैजिक को सक्षम बनाती है। अपनी .htaccess
फ़ाइल की शुरुआत में एक सरल रीडायरेक्ट कमांड जोड़कर
, आप सर्वर को किसी भी ट्रेलिंग स्लैश को स्वचालित रूप से हटाने के लिए मजबूर कर सकते हैं।