Problemy ze zmiennymi htacces 2

Nov 26 2020

PRZED zainstalowaniem SSL wszystko działało idealnie !! Oto kod, który mam w moim głównym pliku .htaccess serwera WWW:

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]

Działa i robi dokładnie to, czego chcę. Więc jeśli pójdę na przykład:

www.andrea.com/account

uzyskuje dostęp do „www.andrea.com/account.php”. Tego właśnie chcę. Jednak mam folder w katalogu głównym o nazwie „produkty”. W tym folderze znajduje się inny plik „.htaccess” i nie wiem, który z tych 2 elementów musi zostać zmieniony, aby poniższe czynności działały.

Po przejściu do tego adresu URL: http: ____ / products / view / Hello / Goodbye

Chcę, żeby miał dostęp do "view.php" w folderze 'products' iw tym pliku php mógłbym zrobić to:

$id = $_GET["id"];    //      This would have "Hello"
$cat = $_GET["cat"];    //   This would have "Goodbye"

I to działa dobrze, gdy używam tego htaccess w folderze "products":

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

Problem z powyższym kodem jest taki, że jeśli przejdę do: http: ____ / products / Hello / Goodbye

Chcę, aby miał dostęp do „index.php”, który znajduje się w folderze „products”. Ale zamiast tego trafia do "view.php" !! To tak, jakby powyższy kod htaccess zmusił wszystkich do przejścia do view.php (co powinno być zrobione tylko wtedy, gdy mam "view / ____" w adresie URL. Chcę, aby powyższy adres URL przeszedł do "index.php" w "produktach ”iw tym pliku powinienem mieć dostęp do zmiennych ID i CAT.

Jakieś pomysły, co zmienić w moim pliku .htaccess? Przepraszam, spędziłem ponad 2 godziny Nie rozumiem ani jednej linii na dole mojego kodu, ale to nie działa: /

Odpowiedzi

1 AmitVerma Nov 26 2020 at 11:35

Możesz użyć następującej reguły, aby przepisać /products/Hello/Goodbyedo /products/index.php.

RewriteRule ^Hello/GoodBye/?$ /product/index.php?id=hello&cat=Goodbye  [L,NC]

Oto twój kompletny /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

Po pierwsze, należy wyłączyć MultiViews. W mojej odpowiedzi do swojej wcześniejszej pytanie , moja sugestia, aby użyć MultiViews był ściśle „alternatywną” metoda w kontekście Twojego pytania. Nie możesz używać obu metod (mod_rewrite i MultiViews) do pracy z adresami URL bez rozszerzeń. A ponieważ chcesz teraz zrobić więcej rzeczy i przekazać parametry, MultiViews spowoduje tylko konflikty. (MultiViews prawdopodobnie „wygra” i żadne parametry nie zostaną przekazane).

Czy potrzebujesz dodatkowego .htaccesspliku w /productspodkatalogu? Będzie (prawdopodobnie) łatwiej mieć pojedynczy .htaccessplik w katalogu głównym dokumentu. Pozwoli to uniknąć konieczności powtarzania przekierowania HTTP do HTTPS (chociaż faktycznie nie umieściłeś przekierowania HTTP na HTTPS w .htaccesspliku podkatalogu ?).

# /products/.htaccess
RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2

Ta dyrektywa pasuje do obu view/Hello/Goodbye i Hello/Goodbye , co wyjaśnia, dlaczego wszystko jest zapisywane w twoim view.phpskrypcie. Jednak tak naprawdę nie robi tego, co mówisz - co jest zastanawiające. Jeśli zażądasz /products/view/Hello/Goodbye, przepisze żądanie do /products/view.php?id=view&cat=Hello/Goodbye- co nie jest intencją (chyba że włączono MutliViews, w którym to przypadku żadne parametry nie zostaną w ogóle przekazane).

Musisz faktycznie sprawdzić viewsw żądanej ścieżce URL przed próbą przepisania na views.php. A jeśli viewsnie jest obecny, przepisz na index.phpzamiast. To „warunkowe rozgałęzienie” można osiągnąć, po prostu ustawiając najpierw dyrektywy w kolejności „bardziej szczegółowych” reguł.

Na przykład w .htaccesspliku głównym spróbuj wykonać następujące czynności. (I /products/.htaccesscałkowicie usuń plik.)

# 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]

Kolejność powyższych 3 reguł jest ważna. Najbardziej szczegółowa zasada jest pierwsza. Włączenie Lflagi, aby zapobiec dalszemu (niepotrzebnemu) przetwarzaniu.

Zauważ, że zgodnie z oryginalnymi dyrektywami, dla żądania formularza /products/view/Hello/Goodbye(lub /products/Hello/Goodbye), Hello/Goodbyeczęść jest całkowicie opcjonalna i naturalnie spowoduje ustawienie parametrów idi catadresu URL, ale pustych.

Ponadto, zgodnie z pierwotnymi dyrektywami, żądanie formularza /products/view/Hello/Goodbye/foo/bar/bazspowoduje ustawienie catparametru adresu URL na Goodbye/foo/bar/baz(wszystko, co następuje po początkowym segmencie ścieżki).

Nie musisz koniecznie sprawdzać, czy żądanie jest mapowane na plik lub katalog (co jest stosunkowo drogie ), jeśli określisz swoje wyrażenie regularne bardziej szczegółowo i dopasujesz tylko to, co musisz dopasować. Na przykład Twoje wyrażenie regularne /([^/]*)/?(.*)aktualnie pasuje do prawie wszystkiego . Ale jeśli twoje zmienne <id>i <cat>mogą składać się tylko z małych liter (na przykład), może to uniknąć konieczności sprawdzania systemu plików.

Inne notatki:

  • Czy musisz sprawdzić nazwę hosta w przekierowaniu HTTP na HTTPS? Czy hostujesz wiele domen? W przeciwnym razie warunek sprawdzający względem HTTP_HOSTzmiennej serwera nie jest wymagany.