2009-07-22 12 views
6

Próbuję napisać zestaw reguł mod_rewrite, które pozwalają moim użytkownikom wykorzystać jeden folder do robienia projektów na różnych projektach i nie muszą zmywać z dodawaniem vhostów dla każdego projektu.Apache mod_rewrite subdomena do podfolderu (poprzez wewnętrzne przekierowanie)

Mój pomysł, aby to osiągnąć, polega na skonfigurowaniu "Global VHost" dla każdego użytkownika, który potrzebuje tej umiejętności (tylko 3-4), a vhost będzie podobny do: .my-domain.com. Stamtąd chcę promować moich użytkowników, aby pisali kod tak, jakby był w domenie, a nie w podkatalogu. Na przykład, jeśli Bob pracował nad projektem o nazwie "gnome", chciałbym, aby adres URL boba (i każdego innego w naszej wewnętrznej sieci) został załadowany, aby uzyskać ten projekt: http://gnome.bob.my-domain.com. Ale chciałbym, żeby Apache to zrobił, rozpoznaje, że "gnome" jest "projektem", a więc wewnętrznie zamapuje żądanie na bob.my-domain.com/gnome/.

Mam to, co myślałem, że zadziała, i to całkiem proste, ale ... to nie działa! Żądanie przechodzi w nieskończoną pętlę i utrzymuje prefiksację subdomeny na ponownie zapisanym identyfikatorze URI żądania.

Mod przepisać kod mam jest:

RewriteEngine On 

RewriteCond %{HTTP_HOST} ^([^.]+)\.bob\.my-domain\.com 
RewriteCond %{REQUEST_URI} !^/%1.* 
RewriteRule ^(.*)$  /%1/$1 [L] 

Mam googled się trochę na ten temat, ale mam jeszcze znaleźć żadnych realnych rozwiązań, które działają. Czy ktoś próbował tego - a może ktoś ma lepszy pomysł? Nie wymaga to tworzenia wirtualnego hosta dla każdego projektu (mam projektantów). Sądzę, że wszyscy zgodziliby się, że projektant nie powinien tworzyć wirtualnych hostów.)

Dzięki!

Oto urywek z rewrite_log:

[rid#838dc88/initial] (3) [perdir /home/bob/http/] strip per-dir prefix: /home/bob/http/index.html -> index.html 
[rid#838dc88/initial] (3) [perdir /home/bob/http/] applying pattern '^(.*)$' to uri 'index.html' 
[rid#838dc88/initial] (4) [perdir /home/bob/http/] RewriteCond: input='gnome.bob.my-domain.com' pattern='^([^.]+)\.bob\.my-domain\.com' => matched 
[rid#838dc88/initial] (4) [perdir /home/bob/http/] RewriteCond: input='/index.html' pattern='!^/%1.*' => matched 
[rid#838dc88/initial] (2) [perdir /home/bob/http/] rewrite 'index.html' -> '/gnome/index.html' 
[rid#838dc88/initial] (1) [perdir /home/bob/http/] internal redirect with /gnome/index.html [INTERNAL REDIRECT] 
[rid#8392f30/initial/redir#1] (3) [perdir /home/bob/http/] strip per-dir prefix: /home/bob/http/gnome/index.html -> gnome/index.html 
[rid#8392f30/initial/redir#1] (3) [perdir /home/bob/http/] applying pattern '^(.*)$' to uri 'gnome/index.html' 
[rid#8392f30/initial/redir#1] (4) [perdir /home/bob/http/] RewriteCond: input='gnome.bob.my-domain.com' pattern='^([^\.]+)\.bob\.my-domain\.com' => matched 
[rid#8392f30/initial/redir#1] (4) [perdir /home/bob/http/] RewriteCond: input='/gnome/index.html' pattern='!^/%1.*' => matched 
[rid#8392f30/initial/redir#1] (2) [perdir /home/bob/http/] rewrite 'gnome/index.html' -> '/gnome/gnome/index.html' 
[rid#8392f30/initial/redir#1] (1) [perdir /home/bob/http/] internal redirect with /gnome/gnome/index.html [INTERNAL REDIRECT] 
[rid#8397970/initial/redir#2] (3) [perdir /home/bob/http/] add path info postfix: /home/bob/http/gnome/gnome -> /home/bob/http/gnome/gnome/index.html 

To jest tylko fragment, istnieje kilka 10s lub 100 albo więc linie apache zasadzie przepisywanie /gnome/index.html do/gnome/gnome /gnome/gnome/gnome/index.html itp przed apache uderza swój limit przepisywania, rezygnuje i rzuca błąd 500

+0

Dodano więcej informacji z dzienników do przepisywania, mam nadzieję, że ktoś próbował już to wcześniej lub ma jakiś wkład w to, jak mogę to zrobić! Dzięki chłopaki (i dziewczęta) –

Odpowiedz

5

Po kilku latach ignoruje ten problem i wraca do w różnych punktach wreszcie znalazłem praktyczne rozwiązanie.

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^([^.]+)\.bob\.my-domain\.com 
RewriteCond %1::%{REQUEST_URI} !^(.*?)::/\1/ 
RewriteRule ^(.*)$ /%1/$1 [L] 

Co znalazłem było to, że z powrotem odniesień do poprzednich RewriteCond kierunkach nie są dostępne w parametrze ConditionPattern przyszłych RewriteConditions. Jeśli chcesz użyć odwołania wstecznego z poprzedniej dyrektywy RewriteCond, możesz użyć go tylko w parametrze TestString.

Powyższe dyrektywy poprzedzają subdomenę zgodną z dyrektywą I RewriteCond w RequestURI, ograniczoną przez ::. Co następnie robimy w ciągu testowym RewriteCond (regex) ponownie przechwytujemy nazwę subdomeny, a następnie sprawdzamy, czy nasz rzeczywisty RequestURI nie zaczyna się od tej subdomeny jako folderu za pomocą odnośnika wstecznego w tym samym regexie .

To brzmi dużo bardziej zagmatwująco, niż jest w rzeczywistości, i nie mogę wziąć kredytu za odkrycie odpowiedzi. Znalazłem odpowiedź jako odpowiedź na inne pytanie tutaj, %N backreference inside RewriteCond. Dzięki Jon Lin za odpowiedź na to pytanie i nieznane mu też moje pytanie!

+0

Wystarczy notatkę, że musiałem usunąć koniec/na drugim RewriteCond, aby go poprawnie dla mnie działa. Byłem w stanie załadować mój adres URL (instalacja gallery3), ale zasoby CSS nie ładowały się poprawnie. Usunięcie go z końcowego ukośnika naprawiło to. Wyglądało na to, że skończyło się // na adresie URL z tym adresem. – stuckj

0

Niektóre pytania:

Mówiłeś "map wewnętrznie" - czy nie chcesz użyć przekierowania?

Używasz tego samego VirtualHost dla gnome.bob.mysite.com i bob.mysite.com

Czy pamiętać, aby stworzyć ServerAlias ​​dla *.bob.mysite.com?


Oto przybliżona wersja, którą można zmodyfikować do pracy. Przechwyci ona subdomenę i żądany adres URL i wykona przekierowanie do domeny głównej z subdomeną jako pierwszą częścią ścieżki, a następnie żądaną ścieżką, po której następuje ciąg zapytania.

ServerName www.mysite.com 
ServerAlias *.mysite.com 

RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9-]+)\\.mysite.com$ 
RewriteRule ^/(.*)  http://www.mysite.com/%1/$1  [R=301,L]',  
+0

Zdecydowanie chcę wewnętrznego przekierowania. celem tego jest możliwość użycia bezwzględnych ścieżek w linkach, css, img srcs, itp. Istnieje/będzie wirtualny host dla .my-site.com z aliasem dla *. .my-site.com, więc każda żądana domena .my-site.com lub poniżej zostanie pobrana przez tego vhosta –

0

Czy próbowałeś użyć innej reguły przepisywania, aby przetworzyć poprzednią?

RewriteEngine On 

RewriteCond %{HTTP_HOST}      ^([^.]+)\.bob\.my-domain\.com 
RewriteCond %{REQUEST_URI}      !^/%1.* 
RewriteRule ^(.*)$        /%1/$1 [C]  
RewriteRule ^/(.*)\.bob\.my-domain\.com/(.*) /$1/$2 [L] 

Ale myślę, że twoim większym problemem jest to, że twój serwer nie rozumie, że jest obsługiwany pod inną nazwą.

Uważa, że ​​działa w katalogu/gnome /, podczas gdy przeglądarka działa w katalogu /. Więc wszelkie względne adresy URL, które masz, będą powodować problemy.

Potrzebny jest filtr, który uruchomi wszystkie adresy URL na twojej stronie za pośrednictwem procesora i zmieni je z/gnome/na /.

+0

. Chodzi o to, aby zniechęcić względne adresy URL, ale pod tą strukturą powinny one również działać. –

+0

również, jestem dość pewny, że host HTTP nie jest używany w RewriteRule, tylko URI –

Powiązane problemy