2010-03-23 11 views
8

muszę regułę przepisywania nginx przepisać od:nginx subdomeny przepisać

http://some-keyword.example.com do www.example.com/keyword.php?keyword=$some-keyword

natomiast domena bez www przed wciąż przepisuje do www.example.com i www nie jest brane jako słowa kluczowego.

Czy możesz mi pomóc rozwiązać ten problem, jak napisać te dwie reguły?

+0

Mówisz przepisać (jak po stronie serwera, przepisywanie proxy), ale brzmi to tak jakbyś miał na myśli przekierowanie? Po przekierowaniu URL widoczny dla zmian użytkownika. Przy przepisywaniu serwera proxy wszystko dzieje się po stronie serwera, niewidoczne dla użytkownika. – conny

+0

Miałem na myśli przepisanie, co powinni zobaczyć użytkownicy: http://keyword.example.com Conny – ivan73

Odpowiedz

7

Jeśli oznaczało przekierować, a następnie:

server { 
    server_name ~^(.*)\.example\.com$ ; 

    rewrite^http://www.example.com/keyword.php?keyword=$1 redirect; 
} 

W przypadku przepisanie po prostu zrobić

server { 
    server_name example.com ~^(.*)\.example\.com$ ; 

    rewrite^/keyword.php?keyword=$1 break; 

# location /keyword.php { 
# .... 
# } 
} 
+1

Nawet jeśli pytanie dotyczyło przepisywania, to przykład nie wyklucza "www", jak powinien. Musisz dodać do tego negatywną konstrukcję z wyprzedzeniem: '^ ((?! www \.). *) \. Example \ .com $' – conny

+0

Konfiguracja powinna być w porządku bez negatywnego uprzedzenia, ponieważ Nginx ma takie uporządkowanie wyszukiwania serwerów, że pełne nazwy (www.example.com) idą przed wyrażeniem regularnym. –

+0

Mam podobny problem, ale to rozwiązanie nie wydaje się przepisywania hosta. W PO zażądał, aby serwer obsługiwał www.example.com/keyword.php?keyword=$1 po zakończeniu reguł, ale wydaje się, że przepisuje tylko ścieżkę i zapytanie. Czy istnieje sposób na wewnętrzną zmianę hosta? Widziałem tylko przykłady z przekierowaniami i wszystkie moje eksperymenty zawiodły. Dzięki. –

2
rewrite ^/list-c-([0-9]+)-k-(.+)-o-1\.html$ /index.php?module=Default&action=List&c=$1&k=$2&o=1 last; 
rewrite ^/list-c-([0-9]+)-k-(.+)-o-1-p-(.+)\.html$ /index.php?module=Default&action=List&c=$1&k=$2&o=1&p=$3 last; 
rewrite ^/list-c-([0-9]+)-k-(.+)-o-1-price-(.+)\.html$ /index.php?module=Default&action=List&c=$1&k=$2&o=1&price=$3 last; 
rewrite ^/list-c-([0-9]+)-k-(.+)-o-(.+)-p-1\.html$ /index.php?module=Default&action=List&c=$1&k=$2&o=$3&p=1 last; 
rewrite ^/list-c-([0-9]+)-k-(.+)-o-(.+)-p-(.+)\.html$ /index.php?module=Default&action=List&c=$1&k=$2&o=$3&p=$4 last; 
0

Jeśli to możliwe chciałbym tworzyć tylko 1 serwer (wirtualny host), który jest normalnym domain.com/www.domain.com, a następnie użyć conf, aby przepisać resztę na nich

server { 
    server_name domain.com www.domain.com; 
    # normal handling for files 
} 

server { 
    server_name ~(?<subdomain>[^\.]*).domain.com; 
    location/{ 
     try_files keyword.php?keyword=$subdomain =404; 
    } 
} 

proszę, powiedz mi, jeśli coś przeoczyłem.