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.