Comment rediriger une URL unique dans nginx?


111

Je suis en train de réorganiser la structure de l'URL. J'ai besoin de configurer des règles de redirection pour des URL spécifiques - j'utilise NGINX.

Fondamentalement, quelque chose comme ça:

http://example.com/issue1 --> http://example.com/shop/issues/custom_issue_name1
http://example.com/issue2 --> http://example.com/shop/issues/custom_issue_name2
http://example.com/issue3 --> http://example.com/shop/issues/custom_issue_name3

Merci!


3
Est-ce "isse" ou "issue"?! Les réponses supposent "problème" ...
Matthew Wilcoxson

c'est un problème, correction de la faute de frappe
tokmak

Réponses:


122

Mettez ceci dans votre directive de serveur:

location /issue {
   rewrite ^/issue(.*) http://$server_name/shop/issues/custom_issue_name$1 permanent;
 }

Ou dupliquez-le:

location /issue1 {
   rewrite ^/.* http://$server_name/shop/issues/custom_issue_name1 permanent;
}
location /issue2 {
   rewrite ^.* http://$server_name/shop/issues/custom_issue_name2 permanent;
}
 ...

139
location ~ /issue([0-9]+) {
    return 301 http://example.com/shop/issues/custom_isse_name$1;
}

@Cybolic Je viens de tester ceci sur une image docker avec la version 1.10.3et c'était bien, pourriez-vous fournir votre fichier de configuration d'une manière ou d'une autre? Il vous manque probablement quelque chose.
Mohammad AbuShady

34

Si vous avez besoin de dupliquer plus de quelques redirections, vous pouvez envisager d'utiliser une carte:

# map is outside of server block
map $uri $redirect_uri {
    ~^/issue1/?$    http://example.com/shop/issues/custom_isse_name1;
    ~^/issue2/?$    http://example.com/shop/issues/custom_isse_name2;
    ~^/issue3/?$    http://example.com/shop/issues/custom_isse_name3;
    # ... or put these in an included file
}

location / {
    try_files $uri $uri/ @redirect-map;
}

location @redirect-map {
    if ($redirect_uri) {  # redirect if the variable is defined
        return 301 $redirect_uri;
    }
}

4
C'est ce que je suis venu chercher ici - les mettre dans un fichier inclus est un excellent moyen de remplacer mon fichier .htaccess plein de RewriteRules d'Apache.
Josh de Qaribou

3
Comment combineriez-vous cette approche cartographique avec une configuration de type location / ... proxy_pass existante?
Michael Dausmann

Dans l' @redirect-mapemplacement, vous pouvez essayer if ($redirect_uri = "") {return 404;}suivi de trucs proxy_pass. Pourrait avoir besoin d'une réécriture en utilisant $redirect_uri.
Cole Tierney

Cela peut être nécessaire au lieu des 2 locationblocs en fonction de votre configuration. C'est pour Craft CMS par exemple. location ~ ^(.*)$ { if ($redirect_uri) { # redirect if the variable is defined return 301 $redirect_uri; } try_files $uri $uri/ /index.php?p=$uri&$args; }
luwes
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.