Come reindirizzare un singolo URL in nginx?


111

Sono in procinto di riorganizzare la struttura dell'URL. Ho bisogno di impostare le regole di reindirizzamento per URL specifici: sto usando NGINX.

Fondamentalmente qualcosa di simile:

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

Grazie!


3
È "isse" o "issue" ?! Le risposte presumono "problema" ...
Matthew Wilcoxson

è il problema, corretto l'errore di battitura
tokmak

Risposte:


122

Metti questo nella direttiva del tuo server:

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

Oppure duplicalo:

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 L'ho appena testato su un'immagine docker con la versione 1.10.3ed è andato tutto bene, potresti fornire il tuo file di configurazione in qualche modo? Probabilmente ti stai perdendo qualcosa.
Mohammad AbuShady,

34

Se devi duplicare più di pochi reindirizzamenti, potresti prendere in considerazione l'utilizzo di una mappa:

# 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
Questo è quello che sono venuto qui a cercare: metterli in un file incluso è un modo eccellente per sostituire il mio file .htaccess pieno di RewriteRules da apache.
Josh da Qaribou

3
come combinereste questo approccio alla mappa con una configurazione di tipo location / ... proxy_pass esistente?
Michael Dausmann

Nella @redirect-mapposizione potresti provare if ($redirect_uri = "") {return 404;}seguito da roba proxy_pass. Potrebbe essere necessaria una riscrittura utilizzando $redirect_uri.
Cole Tierney

Potrebbe essere necessario al posto dei 2 locationblocchi a seconda della configurazione. Questo è per Craft CMS, ad esempio. location ~ ^(.*)$ { if ($redirect_uri) { # redirect if the variable is defined return 301 $redirect_uri; } try_files $uri $uri/ /index.php?p=$uri&$args; }
Luwes il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.