Wie leite ich eine einzelne URL in Nginx um?

111

Ich bin dabei, die URL-Struktur neu zu organisieren. Ich muss Umleitungsregeln für bestimmte URLs einrichten - ich verwende NGINX.

Grundsätzlich so etwas:

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

Vielen Dank!

tokmak
quelle
3
Ist es "isse" oder "issue" ?! Antworten gehen von "Problem" aus ...
Matthew Wilcoxson
Es ist ein
tokmak

Antworten:

122

Fügen Sie dies in Ihre Server-Direktive ein:

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

Oder duplizieren Sie es:

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
quelle
139
location ~ /issue([0-9]+) {
    return 301 http://example.com/shop/issues/custom_isse_name$1;
}
Mohammad AbuShady
quelle
@Cybolic Ich habe dies gerade auf einem Docker-Image mit der Version getestet 1.10.3und es war in Ordnung. Könnten Sie Ihre Konfigurationsdatei irgendwie bereitstellen? Ihnen fehlt wahrscheinlich etwas.
Mohammad AbuShady
34

Wenn Sie mehr als ein paar Weiterleitungen duplizieren müssen, können Sie eine Karte verwenden:

# 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
quelle
4
Dies ist, was ich hier gesucht habe - das Einfügen dieser in eine enthaltene Datei ist eine hervorragende Möglichkeit, meine .htaccess-Datei voller RewriteRules von Apache zu ersetzen.
Josh aus Qaribou
3
Wie würden Sie diesen Kartenansatz mit einem vorhandenen Setup des Typs location / ... proxy_pass kombinieren?
Michael Dausmann
An der @redirect-mapStelle könnten Sie versuchen, if ($redirect_uri = "") {return 404;}gefolgt von proxy_pass Sachen. Möglicherweise muss mit neu geschrieben werden $redirect_uri.
Cole Tierney
Dies kann locationje nach Setup anstelle der 2 Blöcke erforderlich sein . Dies gilt beispielsweise für 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