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.