2010-03-23 8 views
8

je besoin d'une règle de réécriture de nginx réécrire à partir de:nginx rewrite sous-domaine

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

tout domaine sans www devant récrit encore www.example.com et www n'est pas pris comme mot-clé.

S'il vous plaît pourriez-vous m'aider à résoudre ce problème, comment écrire ces deux règles?

+0

Vous dites réécrire (comme côté serveur, réécriture du proxy) mais vous semblez vouloir dire redirection? Sur une redirection l'URL visible à l'utilisateur change. Sur une réécriture de proxy, tout se passe du côté serveur, invisible pour l'utilisateur. – conny

+0

Je voulais dire réécrire, ce que les utilisateurs devraient voir est http://keyword.example.com Conny – ivan73

Répondre

7

Si vous vouliez dire rediriger, puis:

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

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

Dans le cas de rewrite alors simplement faire

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

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

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

Même si la question concernait les réécritures, votre exemple n'exclut pas "www" comme il se doit. Vous devez ajouter une construction lookahead négative pour cela: '^ ((?! www.). *) \. Example \ .com $' – conny

+0

La config devrait être ok sans lookahead négatif, parce que Nginx a l'ordre de recherche de serveur tel que les noms complets (www.example.com) vont avant regexes. –

+0

J'ai un problème similaire, mais cette solution ne semble pas réécrire l'hôte. Dans l'OP, il a demandé que le serveur gère www.example.com/keyword.php?keyword=$1 lorsque les règles étaient terminées, mais cela semble réécrire uniquement le chemin et la requête. Existe-t-il un moyen de réécrire l'hôte en interne? J'ai seulement vu des exemples utilisant des redirections et toutes mes expériences ont échoué. Merci. –

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

S'il est possible que je ne crée 1 serveur (virtuel hôte) qui est la normale domain.com/www.domain.com et ensuite utiliser le conf pour réécrire le reste

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; 
    } 
} 

s'il vous plaît dites-moi si j'ai raté quelque chose.