Problemy ze zmiennymi htacces 2
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
Możesz użyć następującej reguły, aby przepisać /products/Hello/Goodbye
do /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
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 .htaccess
pliku w /products
podkatalogu? Będzie (prawdopodobnie) łatwiej mieć pojedynczy .htaccess
plik 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 .htaccess
pliku 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.php
skrypcie. 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ć views
w żądanej ścieżce URL przed próbą przepisania na views.php
. A jeśli views
nie jest obecny, przepisz na index.php
zamiast. 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 .htaccess
pliku głównym spróbuj wykonać następujące czynności. (I /products/.htaccess
cał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 L
flagi, aby zapobiec dalszemu (niepotrzebnemu) przetwarzaniu.
Zauważ, że zgodnie z oryginalnymi dyrektywami, dla żądania formularza /products/view/Hello/Goodbye
(lub /products/Hello/Goodbye
), Hello/Goodbye
część jest całkowicie opcjonalna i naturalnie spowoduje ustawienie parametrów id
i cat
adresu URL, ale pustych.
Ponadto, zgodnie z pierwotnymi dyrektywami, żądanie formularza /products/view/Hello/Goodbye/foo/bar/baz
spowoduje ustawienie cat
parametru 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_HOST
zmiennej serwera nie jest wymagany.