Widziałem to w kilku .htaccess
przykładach
RewriteBase /
Wygląda na nieco podobną funkcjonalnie do <base href="">
HTML.
Wierzę, że może automatycznie przypisać swoją wartość do początku RewriteRule
instrukcji (być może tych bez wiodącego ukośnika)?
Nie mogłem sprawić, żeby działał poprawnie. Myślę, że jego użycie może się przydać do przenoszenia stron, ponieważ często mam serwer programistyczny, który różni się od serwera produkcyjnego. Moja obecna metoda pozwala mi usuwać fragmenty ze swoich RewriteRule
wyciągów.
Czy ktoś może mi krótko wyjaśnić, jak to wdrożyć?
Dzięki
.htaccess
mod-rewrite
alex
źródło
źródło
Odpowiedzi:
Moimi własnymi słowami, po przeczytaniu dokumentacji i eksperymentowaniu:
Możesz użyć,
RewriteBase
aby zapewnić bazę dla swoich przeróbek. Rozważ toTo jest prawdziwa zasada, której użyłem, aby upewnić się, że adresy URL mają ukośnik końcowy. To się skonwertuje
do
Mając
RewriteBase
tam, sprawiasz, że ścieżka względna nie odpowiadaRewriteBase
parametrowi.źródło
$1
dopasowuje nawiasowy wzorzec RewriteRule, ale ścieżka względna podstawienia pochodzi z parametru RewriteBase. Tak więc wynikowe podstawienie to/~new/$1/
.RewriteBase
dyrektyw. Krótko mówiąc, nie możesz mieć więcej niż jednego - myślę, że ostatniaRewriteBase
dyrektywa wygrywa i wpływa na cały plik .htaccess.RewriteBase
w celu zapewnienia podstawy dla przepisuje” - to dość dużo tylko przegrupowanie słów - ale nie mam pojęcia, co to jest „baza” jest w tym kontekście, ani w jaki sens podany przykład byłby inny, gdybyRewriteBase
linia została usunięta. Przejdźmy do instrukcji idę ...RewriteBase
jest stosowana tylko do tarczy o względnej reguła przepisywania.Używanie RewriteBase w ten sposób ...
jest zasadniczo taki sam jak ...
Ale gdy plik .htaccess znajduje się w środku, oznacza
/folder/
to również ten sam cel:Chociaż dokumenty sugerują, że zawsze używa a
RewriteBase
, Apache zwykle wykrywa go poprawnie dla ścieżek w DocumentRoot, chyba że:Używasz
Alias
dyrektywKorzystasz z reguł przepisywania .htaccess do wykonywania przekierowań HTTP (zamiast po prostu cichego przepisywania) do względnych adresów URL
W takich przypadkach może się okazać, że musisz określić RewriteBase.
Ponieważ jednak jest to myląca dyrektywa, ogólnie lepiej jest po prostu określić bezwzględne (zwane też „względnymi rootami”) identyfikatory URI w obiektach do przepisywania. Inni programiści czytający twoje reguły łatwiej je zrozumieją.
Cytując doskonałą odpowiedź Jona Lin tutaj :
W pliku htaccess mod_rewrite działa podobnie do kontenera
<Directory>
lub<Location>
. iRewriteBase
służy do zapewnienia względnej podstawy ścieżki.Załóżmy na przykład, że masz taką strukturę folderów:
Aby uzyskać dostęp do:
http://example.com/
(korzeń)http://example.com/subdir1
(subdir1)http://example.com/subdir2
(subdir2)http://example.com/subdir2/subsubdir
(subsubdir)Identyfikator URI wysyłany przez a
RewriteRule
jest względny do katalogu zawierającego plik htaccess. Więc jeśli masz:/a/b/c/d
, to przechwycony URI ($1
) jesta/b/c/d
.subdir2
a żądanie jest,/subdir2/e/f/g
to przechwycony identyfikator URI toe/f/g
.subsubdir
, a żądanie jest/subdir2/subsubdir/x/y/z
, to przechwycony identyfikator URI tox/y/z
.W katalogu, w którym znajduje się reguła, ta część jest pozbawiona identyfikatora URI. Baza przepisywania nie ma na to wpływu, po prostu działa na katalog.
Co baza przepisać ma zrobić, to stworzyć podstawy ścieżka_url ( nie bazie file-path) dla dowolnego względnych ścieżek w celu reguł można . Powiedzmy, że masz tę zasadę:
Jest
bar.php
to ścieżka względna, w przeciwieństwie do:gdzie
/bar.php
jest ścieżka absolutna. Ścieżką bezwzględną zawsze będzie „root” (w powyższej strukturze katalogów). Oznacza to, że niezależnie od tego, czy reguła znajduje się w katalogu „root”, „subdir1”, „subsubdir” itd.,/bar.php
Ścieżka zawsze jest odwzorowywanahttp://example.com/bar.php
.Ale druga reguła, ze ścieżką względną, jest oparta na katalogu, w którym reguła się znajduje. Więc jeśli
jest w „katalogu głównym” i idziesz do
http://example.com/foo
, dostajesz obsłużonyhttp://example.com/bar.php
. Ale jeśli ta reguła znajduje się w katalogu „subdir1” i przejdziesz dohttp://example.com/subdir1/foo
, zostaniesz obsłużonyhttp://example.com/subdir1/bar.php
. itp. Czasami to działa, a czasem nie, jak mówi dokumentacja, powinno być wymagane w przypadku ścieżek względnych, ale przez większość czasu wydaje się, że działa. Z wyjątkiem sytuacji, gdy przekierowujesz (używającR
flagi lub pośrednio, ponieważ maszhttp://host
w celu regułę). Oznacza to, że zasada:jeśli jest w katalogu „subdir2” i udać się
http://example.com/subdir2/foo
będzie mod_rewrite pomylić ścieżkę względną jako pliku ścieżce zamiast ścieżka_url i ze względu naR
flagi, będziesz skończyć uzyskiwanie przekierowany na coś takiego:http://example.com/var/www/localhost/htdocs/subdir1
. Co oczywiście nie jest tym, czego chcesz.W tym miejscu
RewriteBase
pojawia się. Dyrektywa mówi mod_rewrite, co należy dołączyć na początku każdej ścieżki względnej. Więc jeśli mam:w „subsubdir”,
http://example.com/subdir2/subsubdir/foo
naprawdę będzie mi służyćhttp://example.com/blah/bar.php
. „Bar.php” jest dodawany na końcu bazy. W praktyce ten przykład zazwyczaj nie jest tym, czego potrzebujesz, ponieważ nie możesz mieć wielu baz w tym samym kontenerze katalogu lub pliku htaccess.W większości przypadków jest on używany w następujący sposób:
gdzie reguły te znajdują się w katalogu „subdir1” i
będzie w katalogu „subsubdir”.
To częściowo pozwala uczynić twoje reguły przenośnymi, więc możesz upuścić je w dowolnym katalogu i wystarczy zmienić bazę zamiast kilku reguł. Na przykład, jeśli miałeś:
takich, które
http://example.com/subdir1/foo
będą służyćhttp://example.com/subdir1/bar.php
itp. Powiedzmy, że postanowiłeś przenieść wszystkie te pliki i reguły do katalogu „subsubdir”. Zamiast zmieniać każdą instancję/subdir1/
na/subdir2/subsubdir/
, mógłbyś mieć po prostu bazę:A kiedy musisz przenieść te pliki i reguły do innego katalogu, po prostu zmień bazę:
i to wszystko.
źródło
RewriteEngine On
. Na przykład nie potrzebujesz 1 i 1, ale jest to wymagane na moim serwerze dedykowanym.AFAIK, RewriteBase służy tylko do naprawiania przypadków, w których mod_rewrite działa w
.htaccess
pliku, który nie znajduje się w katalogu głównym witryny, i zgaduje niewłaściwą ścieżkę sieciową (w przeciwieństwie do ścieżki systemu plików) dla folderu, w którym działa. Więc jeśli masz RewriteRule w pliku .htaccess w folderze, który jest mapowanyhttp://example.com/myfolder
, możesz użyć:Jeśli mod_rewrite nie działa poprawnie.
Próba użycia go do osiągnięcia czegoś niezwykłego, zamiast rozwiązania tego problemu, brzmi jak przepis na bardzo zagubiony.
źródło
RewriteBase jest użyteczny tylko w sytuacjach, w których możesz umieścić .htaccess tylko w katalogu głównym swojej witryny. W przeciwnym razie lepiej będzie, jeśli umieścisz różne pliki .htaccess w różnych katalogach witryny i całkowicie pominiesz dyrektywę RewriteBase.
Ostatnio, w przypadku złożonych witryn, usuwam je, ponieważ komplikuje wdrażanie plików z testów do życia o jeszcze jeden krok.
źródło
Kiedy się rozwijam, znajduje się w innej domenie w folderze. Kiedy uruchamiam witrynę na żywo, ten folder już nie istnieje. Korzystanie z RewriteBase pozwala mi używać tego samego pliku .htaccess w obu środowiskach.
Kiedy na żywo:
Podczas opracowywania:
źródło
%{REQUEST_URI}
wRewriteCond
dyrektywie na przykład?Najjaśniejsze wyjaśnienie, które znalazłem, nie było w aktualnych dokumentach apache 2.4, ale w wersji 2.0 .
Jak to działa? Dla hakerów apache ten dokument 2.0 podaje „szczegółowe informacje na temat wewnętrznych kroków przetwarzania”.
Wyciągnięta lekcja: Chociaż musimy być zaznajomieni z „prądem”, klejnoty można znaleźć w annałach.
źródło
To polecenie może jawnie ustawić podstawowy adres URL dla twoich przeróbek. Jeśli chcesz zacząć od katalogu głównego swojej domeny, dołącz swój wiersz przed RewriteRule:
źródło
Uważam, że ten fragment dokumentacji Apache dobrze uzupełnia poprzednie odpowiedzi:
źródło