htacces 2 चर मुद्दों

Nov 26 2020

पहले से मैंने एसएसएल चीजों को स्थापित किया था पूरी तरह से काम कर रहे थे !! यहाँ मैं अपने रूट वेबसर्वर .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 घंटे से अधिक समय बिताया है, मुझे अपने कोड के नीचे एक भी लाइन नहीं समझ में आती है लेकिन यह काम नहीं करता है: /

जवाब

1 AmitVerma Nov 26 2020 at 11:35

आप फिर /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
1 MrWhite Nov 27 2020 at 07:13
 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और catURL पैरामीटर सेट किया जा रहा है, लेकिन खाली।

इसके अलावा, आपके मूल निर्देशों के अनुसार, प्रपत्र के अनुरोध के /products/view/Hello/Goodbye/foo/bar/bazपरिणामस्वरूप catURL पैरामीटर सेट किया जाएगा Goodbye/foo/bar/baz(कुछ भी जो प्रारंभिक पथ खंड का अनुसरण करता है)।

यदि आप अपने regex को और अधिक विशिष्ट बनाते हैं और केवल उसी चीज से मेल खाते हैं जो आपको मैच करने की आवश्यकता है, तो आपको यह जांचने की आवश्यकता नहीं है कि कोई फ़ाइल या निर्देशिका (जो अपेक्षाकृत महंगी है ) के लिए मानचित्र । उदाहरण के लिए, आपका रेगेक्स /([^/]*)/?(.*)वर्तमान में बहुत कुछ से मेल खाता है । लेकिन अगर आपके <id>और <cat>चर केवल लोअरकेस अक्षर (उदाहरण के लिए) से मिलकर बन सकते हैं, तो यह फाइल सिस्टम जांच की आवश्यकता से बच सकता है।

अन्य नोट:

  • क्या आपको HTTP में HTTPS रीडायरेक्ट में होस्टनाम की जांच करने की आवश्यकता है? क्या आप कई डोमेन होस्ट करते हैं? अन्यथा HTTP_HOSTसर्वर चर के खिलाफ जांच करने वाली स्थिति की आवश्यकता नहीं है।