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!

tokmak
la source
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;
}
 ...
BraveNewCurrency
la source
139
location ~ /issue([0-9]+) {
    return 301 http://example.com/shop/issues/custom_isse_name$1;
}
Mohammad AbuShady
la source
@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;
    }
}
Cole Tierney
la source
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