2011-10-14 16 views
9

Próbuję uzyskać podstawowe przekierowanie adresu URL dla ładnych adresów URL, a ze względu na obrazy, CSS itp. Również znajdujące się w tej samej ścieżce, muszę się upewnić, że jeśli adres URL jest dostęp bez końcowego ukośnika, jest dodawany automatycznie.Jak wykonać przekierowanie mod_rewrite do względnego adresu URL

Działa to dobrze, jeśli mogę umieścić bezwzględny adres URL tak:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ http://www.mydomain.com/myParentDir/$1/ [R,nc,L] 

Ale jeśli zmienię to względny adres URL, tak, że nie trzeba zmieniać za każdym razem, gdy porusza się rzeczy w folderach to po prostu nie działa.

Są co próbowałem i wszystko nie działa, lub przekierować mnie do rzeczywistego wewnętrznego ścieżki do katalogu na serwerze jak/public_html/...:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ ./myParentDir/$1/ [R,nc,L] 

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ myParentDir/$1/ [R,nc,L] 

Jaki jest właściwy sposób zrobić przekierowanie URL tak, że jeśli użytkownik wprowadzi coś takiego:

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir 

dostaje przekierowany do (poprzez HTTP 301 lub 302):

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir/ 

Dzięki.

EDYCJA: Dodaje więcej szczegółów, ponieważ nie wydaje się jasne. Powiedzmy, że implementuję galerię i chcę mieć ładne adresy URL za pomocą mod_rewrite. Więc chciałbym mieć adresy URL w następujący sposób:

http://www.mydomain.com/somedir/galleries/cats 

które pokazuje miniatury kotów, przy czym:

http://www.mydomain.com/somedir/galleries/cats/persian 

który pokazuje jeden obraz z miniaturkami wszystkich kotów, nazwanych perski. Więc w rzeczywistości fizycznej struktury katalogów i przepisywanie będzie w następujący sposób:

http://www.domain.com/somedir/gallery.php?category=cats&image=persian 

Więc to, co chcę zrobić, to umieścić plik .htaccess w/katalog, który łapie wszystkie żądania skierowane do/galerie oraz w zależności od wirtualne podkatalogi następujące go, wykorzystywać je jako zastępcze w przepisywanie, z reguły 2 przepisywania:

RewriteRule ^galleries/(A-Z0-9_-]+)/$ ./gallery.php?category=$1 [nc] 
RewriteRule ^galleries/(A-Z0-9_-]+)/+([A-Z0-9_-]+)$ ./gallery.php?category=$1&image=$2 [nc] 

teraz problemem jest to, że skrypt galerii w rzeczywistości potrzebuje trochę CSS, JavaScript i obrazy, znajdujący się http://www.domain.com/somedir/css, http://www.domain.com/somedir/js i http://www.domain.com/somedir/images odpowiednio.

Nie chcę kodować bezwzględnie żadnych bezwzględnych adresów URL, więc CSS, JS i obrazy będą kierowane za pomocą względnych adresów URL (./css, ./js, ./images itp.). Więc mogę zrobić nadpisywania URL następująco:

RewriteRule ^galleries/[A-Z0-9_-]+/css/(.*)$ ./css/$1 [nc] 

Problem polega na tym, że od http://www.domain.com/somedir/galleries/cats jest katalogiem wirtualnym, powyższe działa tylko wtedy, gdy użytkownik wpisze:

http://www.domain.com/somedir/gallaries/cats/ 

Jeśli użytkownik pomija ukośnik mod_dir nie doda go, ponieważ w rzeczywistości katalog ten w rzeczywistości nie istnieje.

Jeśli mogę umieścić przepisać przekierowania bezwzględną URL to działa:

RewriteRule ^galleries/([A-Z0-9_-]+)$ http://www.mydomain.com/subdir/galleries/$1/ [R,nc,L] 

Ale nie chcę mieć przedrostek URL sztywno, ponieważ chcę, aby móc umieścić to na cokolwiek chcę domeną w cokolwiek podkat chcę, więc próbowałem to:

RewriteRule ^galleries/([A-Z0-9_-]+)$ galleries/$1/ [R,nc,L] 

Ale zamiast to przekierowuje do:

http://www.mydomain.com/home/myaccount/public_html/subdir/galleries/theRest 

, co oczywiście nie jest tym, czego chcę.

EDIT: Dalsze wyjaśnienia

Rozwiązanie szukam jest uniknięcie hardcoding nazwę domeny lub ścieżki folderu w pliku .htaccess. Szukam rozwiązania, w którym, jeśli zapakuję .htaccess wraz z resztą skryptów i zasobów, gdziekolwiek użytkownik rozpakuje go na swoim serwerze sieciowym, działa on po wyjęciu z pudełka. Wszystkie takie prace poza tym końcowym ukośnikiem.

Więc jakiekolwiek rozwiązanie, które wiąże się z zakodowaniem katalogu nadrzędnego lub ścieżki serwera w. Htaccess w jakikolwiek sposób, nie jest tym, czego szukam.

+0

@DoktorJ Czy edycja mojego wpisu odpowiada na pytanie? –

+0

Powinieneś wybrać akceptowaną odpowiedź, jeśli któraś z nich pomogła. – sjas

Odpowiedz

0

Nie jestem pewien, czy rozumiem Twój problem.

Końcowe przekierowanie jest wykonywane automatycznie na większości instalacji Apache z powodu mod_dir (99% szansy, że masz moduł mod_dir).

może trzeba dodać:

DirectorySlash On 

Ale to wartość domyślna.

So. Jeśli uzyskujesz dostęp do foo/bar, a pasek nie jest plikiem w katalogu foo, ale podkatalogiem, to mod_dir wykonuje przekierowanie do foo/bar/.

Jedyne, co mogłem to złamać, to Option Multiviews, które może próbować dodać do katalogu plik bar.php, bar.php, bar.a-mime-extension-knwon-by-apache. Więc możesz spróbować dodać:

Option -Multiviews 

I usunąć wszystkie przepisania przepisu. Jeśli nie otrzymasz domyślnego zachowania Apache, być może będziesz musiał spojrzeć na przepisywanie modów, ale to tak, jakby użyć bomby atomowej, by zabić pająka. Bomby atomowe mogą być dość drażliwe, aby dobrze się z nich korzystać.

EDIT: Do spływu problemu slash z mod-rewrite można sprawdzić ten documentation howto, stwierdzając, to powinno działać:

RewriteEngine on 
RewriteBase /myParentDir/ 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+[^/])$   $1/ [R] 
+0

Dziękuję za odpowiedź. Pamiętaj jednak, że nie są to rzeczywiste katalogi. Te nie istnieją fizycznie i są po prostu wirtualnymi katalogami dla ładnych adresów URL. W rzeczywistości adres URL: http://www.mydomain.com/somedir/myVirtualParentDir nie istnieje. Bez tego uzyskuję nieprawidłowe odnośniki do obrazów itp. – jbx

+0

Dlaczego uwzględniono RewriteBase? To cały punkt, którego chcę uniknąć. Nie chcę zakodować ścieżki w moim pliku .htaccess. Chcę czegoś, co działa w jakimkolwiek podmiocie, który go umieściłem. Nie różni się to od podania pełnej ścieżki jako http://www.mydomain.com/myParentDir/ w przekierowaniu, której nie chcę. Reszta jest dokładnie taka sama, jak mój pierwotny problem, gdzie $ 1/przekierowuje do rzeczywistego adresu fizycznego, a nie wirtualnego.Sugerowane jest przekierowanie do fizycznego myParentDir/theRest zamiast/myVirtualDir/theRest. – jbx

+0

@jbx: przeczytaj link, należy go umieścić w katalogu najwyższego poziomu i działa dla wszystkich podkatalogów podrzędnych. – regilero

4

Oto rozwiązanie prosto z Apache Documentation (pod "Trailing Slash problem"):

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+[^/])$   $1/ [R] 

Oto a solution że testuje REQUEST_URI dla ukośnik, a następnie dodaje go:

RewriteCond %{REQUEST_URI} !(/$|\.) 
RewriteRule (.+) http://www.example.com/$1/ [R=301,L] 

Oto another solution który pozwala na wyłączenie niektórych wzorów REQUEST_URI:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !example.php 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ http://domain.com/$1/ [L,R=301] 

nadzieję, że te pomoc. :)

1

Ten potęga praca:

RewriteRule ^myParentDir/[A-Z0-9_-]+$ %{REQUEST_URI}/ [NS,L,R=301] 

Jednak nie jestem pewien, dlaczego uważasz, że potrzebujesz tego. Wystarczy dokonać reguła przepisywania plik CSS/JS/obraz wyglądać tak:

RewriteRule ^galleries/([A-Za-z0-9_-]+/)*(css|js|images)/(.*)$ ./$2/$3 

i wszystko powinno działać dobrze niezależnie od tego, czy przeglądarka żąda /somedir/galleries/css/whatever.css lub /somedir/galleries/cats/css/whatever.css lub nawet /somedir/galleries/cats/persian/calico/css/whatever.css.

Ps. Jednym z problemów z tą regułą jest to, że uniemożliwia to wyświetlanie nazw galerii "css", "js" lub "images". Możesz to naprawić, nazywając te katalogi wirtualne takimi, jak ".css", ".js" i ".images", lub używając innego schematu nazewnictwa, który nie koliduje z poprawnymi nazwami galerii.

2

Ta reguła powinna dodać końcowy ukośnik do dowolnego adresu URL, który nie jest prawdziwym plikiem/katalogiem (co, jak sądzę, jest tym, czego potrzebujesz, ponieważ Apache zwykle automatycznie przekierowuje do istniejących katalogów).

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+[^/])$ $1/ [L,R=301] 

Edit:

W celu zapobieżenia Apache z dołączając ścieżkę w stosunku do głównego dokumentu, trzeba użyć RewriteBase. Na przykład w folderze, który ma być katalogiem głównym aplikacji, dodaje się następujące, które zastępuje ścieżkę fizyczną:

RewriteBase/
+0

Wydaje się, że używanie RewriteBase polega na tym, aby mieć zarówno wiodący *, jak i końcowy ukośnik; na przykład "/ foo /" zamiast "/ foo" lub "foo /". RewriteBase był dla mnie wciąż dość skomplikowany, ale ostatecznie się udało. Dzięki! –

Powiązane problemy