Как перенаправить одиночный URL-адрес в nginx?

111

Я занимаюсь реорганизацией структуры URL. Мне нужно настроить правила перенаправления для определенных URL-адресов - я использую NGINX.

В основном примерно так:

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

Спасибо!

токмак
источник
3
Это «иссе» или «проблема» ?! Ответы предполагают «проблему» ...
Мэтью Уилкоксон,
это проблема, исправлена ​​опечатка
токмак

Ответы:

122

Поместите это в свою директиву сервера:

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

Или продублируйте его:

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 Я только что протестировал это на образе докера с версией, 1.10.3и все было хорошо, не могли бы вы как-нибудь предоставить свой файл конфигурации? Вы, наверное, чего-то упускаете.
Mohammad AbuShady,
34

Если вам нужно продублировать более нескольких перенаправлений, вы можете рассмотреть возможность использования карты:

# 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
Это то, что я сюда искал - размещение их во включенном файле - отличный способ заменить мой файл .htaccess, полный RewriteRules из apache.
Джош из Карибу,
3
как бы вы совместили этот подход с картой с существующей настройкой типа location / ... proxy_pass?
Майкл Даусманн
В том @redirect-mapместе, где вы можете попробовать, if ($redirect_uri = "") {return 404;}а затем добавить proxy_pass. Возможно, потребуется переписать с использованием $redirect_uri.
Коул Тирни,
Это может потребоваться вместо двух locationблоков в зависимости от вашей настройки. Это, например, для 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; }
Лювес