Jak przekierować pojedynczy adres URL w nginx?

111

Jestem w trakcie reorganizacji struktury adresu URL. Muszę skonfigurować reguły przekierowania dla określonych adresów URL - używam NGINX.

Zasadniczo coś takiego:

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

Dzięki!

tokmak
źródło
3
Czy jest to „problem” czy „problem” ?! Odpowiedzi zakładają „problem” ...
Matthew Wilcoxson
to problem, naprawiono literówkę
tokmak

Odpowiedzi:

122

Umieść to w swojej dyrektywie serwera:

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

Lub skopiuj to:

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
źródło
139
location ~ /issue([0-9]+) {
    return 301 http://example.com/shop/issues/custom_isse_name$1;
}
Mohammad AbuShady
źródło
@Cybolic Właśnie przetestowałem to na obrazie dockera z wersją 1.10.3i było w porządku, czy możesz jakoś podać swój plik konfiguracyjny? Prawdopodobnie czegoś brakuje.
Mohammad AbuShady
34

Jeśli chcesz zduplikować więcej niż kilka przekierowań, możesz rozważyć użycie mapy:

# 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
źródło
4
Właśnie tego szukałem - umieszczenie ich w załączonym pliku to doskonały sposób na zastąpienie mojego pliku .htaccess pełnego RewriteRules z Apache.
Josh z Qaribou
3
Jak połączyć to podejście do mapy z istniejącą lokalizacją / ... konfiguracją typu proxy_pass?
Michael Dausmann
W @redirect-maplokalizacji możesz spróbować if ($redirect_uri = "") {return 404;}śledzić rzeczy proxy_pass. Może wymagać przepisania przy użyciu $redirect_uri.
Cole Tierney
Może to być potrzebne zamiast 2 locationbloków w zależności od konfiguracji. Dotyczy to na przykład Craft CMS. location ~ ^(.*)$ { if ($redirect_uri) { # redirect if the variable is defined return 301 $redirect_uri; } try_files $uri $uri/ /index.php?p=$uri&$args; }
luwes