htacces 2 चर मुद्दों
पहले से मैंने एसएसएल चीजों को स्थापित किया था पूरी तरह से काम कर रहे थे !! यहाँ मैं अपने रूट वेबसर्वर .htaccess फ़ाइल में कोड है:
Options +MultiViews
RewriteEngine On
RewriteCond %{HTTP_HOST} andrea\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://andrea.com/$1 [R,L]
RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule (.*) $1.php [L]
यह काम करता है और यह वही करता है जो मैं करना चाहता हूं। इसलिए यदि मैं उदाहरण के लिए जाता हूं:
www.andrea.com/account
यह "www.andrea.com/account.php" तक पहुँचता है। जो मुझे चाहिए। हालांकि मेरे पास "उत्पाद" नामक रूट में एक फ़ोल्डर है। उस फ़ोल्डर में एक और ".htaccess" फाइल है और मुझे नहीं पता कि इन दोनों में से किसको नीचे दी गई चीज़ में बदलने के लिए बदलना चाहिए।
जब आप इस url पर जाते हैं: http: ____ / products / view / Hello / Goodbye
मैं यह चाहता हूं कि '' '' फोल्डर '' फोल्डर '' तक पहुंच जाए और उस php फाइल में मैं यह कर सकूं:
$id = $_GET["id"]; // This would have "Hello"
$cat = $_GET["cat"]; // This would have "Goodbye"
और जब यह "उत्पाद" फ़ोल्डर में इस htaccess का उपयोग करता है तो यह अच्छी तरह से काम करता है:
RewriteEngine on
RewriteCond %{HTTP_HOST} !^$ RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2
इस कोड के साथ समस्या यह है, अगर मैं जाता हूं: http: ____ / उत्पादों / नमस्ते / अलविदा
मैं चाहता हूं कि यह "index.php" तक पहुंचें जो "उत्पादों" फ़ोल्डर में है। लेकिन इसके बजाय इसके बजाय "view.php" जाता है !! यह ऊपर दिए गए htaccess कोड की तरह है जो सभी को view.php पर जाने के लिए मजबूर करता है (जो केवल तभी किया जाना चाहिए जब मेरे पास url में "view / ____" हो। मैं चाहता हूं कि ऊपर का url "index.php" उत्पादों में जाए। "फ़ोल्डर और उस फ़ाइल में मुझे आईडी और कैट चर का उपयोग करने में सक्षम होना चाहिए।
मेरी .htaccess फ़ाइल में क्या परिवर्तन करना है इसका कोई विचार? क्षमा करें, मैंने 2 घंटे से अधिक समय बिताया है, मुझे अपने कोड के नीचे एक भी लाइन नहीं समझ में आती है लेकिन यह काम नहीं करता है: /
जवाब
आप फिर /products/Hello/Goodbye
से लिखने के लिए निम्न नियम का उपयोग कर सकते हैं /products/index.php
।
RewriteRule ^Hello/GoodBye/?$ /product/index.php?id=hello&cat=Goodbye [L,NC]
यहाँ आपका पूरा है /product/.htaccess
।
RewriteEngine on
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
#rewrite /products/Hello/GoodBye to /products/index.php
RewriteRule ^Hello/GoodBye/?$ /products/index.php?id=Hello&cat=Goodbye [L,NC] ################### RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2
Options +MultiViews
सबसे पहले, आपको MultiViews को अक्षम करना चाहिए । में मेरा उत्तर आपके लिए पहले सवाल है, मेरे सुझाव का उपयोग करने के MultiViews सख्ती से अपने प्रश्न के संदर्भ में एक "वैकल्पिक" विधि थी। आप एक्सटेंशन रहित URL के साथ काम करने के लिए दोनों तरीकों (mod_rewrite और MultiViews) का उपयोग नहीं कर सकते । और चूंकि आप अब और चीजें करना चाहते हैं और पैरामीटर पास करना चाहते हैं, इसलिए मल्टीव्यू केवल संघर्ष पैदा करेगा। (मल्टीव्यू की संभावना "जीत" होगी और कोई पैरामीटर पास नहीं होगा।)
इसके अलावा, क्या आपको विशेष रूप .htaccess
से /products
उपनिर्देशिका में अतिरिक्त फ़ाइल की आवश्यकता है ? .htaccess
दस्तावेज़ रूट में एकल फ़ाइल रखना (यकीनन) आसान होगा । यह HTTP को HTTPS रीडायरेक्ट पर दोहराने से बचना होगा (हालाँकि आपने वास्तव में HTTP को HTTPS रीडायरेक्ट उपनिर्देशिका .htaccess
फ़ाइल में शामिल नहीं किया है ?)।
# /products/.htaccess RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2
यह निर्देश दोनों से मेल खाता है view/Hello/Goodbye
और Hello/Goodbye
जो बताता है कि क्यों सब कुछ आपके लिए लिखा जा रहा है, view.php
स्क्रिप्ट। हालाँकि, यह वास्तव में वह नहीं कर रहा है जो आप कहते हैं - जो कि हैरान करने वाला है। यदि आप अनुरोध करते हैं, /products/view/Hello/Goodbye
तो यह अनुरोध को फिर से लिख देगा /products/view.php?id=view&cat=Hello/Goodbye
- जो कि इरादा नहीं है (जब तक कि MutliViews सक्षम नहीं है, जिस स्थिति में कोई पैरामीटर पारित नहीं किया जाएगा)।
आपको views
फिर से लिखने का प्रयास करने से पहले अनुरोधित URL-पथ में वास्तव में जांचना होगा views.php
। और अगर views
मौजूद नहीं है तो index.php
इसके बजाय फिर से लिखें। यह "सशर्त शाखा" पहले केवल "अधिक विशिष्ट" नियमों के क्रम में निर्देशों को व्यवस्थित करके प्राप्त किया जा सकता है।
उदाहरण के लिए, अपनी रूट .htaccess
फ़ाइल में निम्नलिखित प्रयास करें। (और /products/.htaccess
फ़ाइल को पूरी तरह से हटा दें ।)
# Ensure that MultiViews is disabled
Options -MultiViews
RewriteEngine On
# HTTP to HTTPS canonical redirect
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://example.com/$1 [R=301,L]
# Abort early if the request already maps to (or looks like) a file or directory
RewriteCond %{REQUEST_URI} \.\w{2,4}$ [OR] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 1. Rewrite "/products/view/<id>/<cat>" to "/products/view.php?id=<id>&cat=<cat> RewriteRule ^(products/view)/([^/]*)/?(.*) $1.php?id=$2&cat=$3 [L]
# 2. Rewrite "/products/<id>/<cat>" to "/products/index.php?id=<id>&cat=<cat>
RewriteRule ^(products)/([^/]*)/?(.*) $1/index.php?id=$2&cat=$3 [L] # 3. Extensionless URLs for other requests RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]
उपरोक्त 3 नियमों का क्रम महत्वपूर्ण है। सबसे विशिष्ट नियम पहले है। L
आगे (अनावश्यक) प्रसंस्करण को रोकने के लिए ध्वज को शामिल करना ।
ध्यान दें कि, के रूप में अपने मूल निर्देशों के अनुसार, फार्म के लिए एक अनुरोध के लिए /products/view/Hello/Goodbye
(या /products/Hello/Goodbye
), Hello/Goodbye
भाग पूरी तरह से वैकल्पिक है और स्वाभाविक रूप से परिणाम होगा id
और cat
URL पैरामीटर सेट किया जा रहा है, लेकिन खाली।
इसके अलावा, आपके मूल निर्देशों के अनुसार, प्रपत्र के अनुरोध के /products/view/Hello/Goodbye/foo/bar/baz
परिणामस्वरूप cat
URL पैरामीटर सेट किया जाएगा Goodbye/foo/bar/baz
(कुछ भी जो प्रारंभिक पथ खंड का अनुसरण करता है)।
यदि आप अपने regex को और अधिक विशिष्ट बनाते हैं और केवल उसी चीज से मेल खाते हैं जो आपको मैच करने की आवश्यकता है, तो आपको यह जांचने की आवश्यकता नहीं है कि कोई फ़ाइल या निर्देशिका (जो अपेक्षाकृत महंगी है ) के लिए मानचित्र । उदाहरण के लिए, आपका रेगेक्स /([^/]*)/?(.*)
वर्तमान में बहुत कुछ से मेल खाता है । लेकिन अगर आपके <id>
और <cat>
चर केवल लोअरकेस अक्षर (उदाहरण के लिए) से मिलकर बन सकते हैं, तो यह फाइल सिस्टम जांच की आवश्यकता से बच सकता है।
अन्य नोट:
- क्या आपको HTTP में HTTPS रीडायरेक्ट में होस्टनाम की जांच करने की आवश्यकता है? क्या आप कई डोमेन होस्ट करते हैं? अन्यथा
HTTP_HOST
सर्वर चर के खिलाफ जांच करने वाली स्थिति की आवश्यकता नहीं है।