2013-02-14 2 views
1

мне нужно правило Nginx переписать для следующей задачи:Nginx правило перезаписи для удаления - и _

У меня есть Urls, которые включают несколько дефис и в конце концов, подчеркивает

Пример запроса: http://www.example.com/cat/cat2/200-AB---a-12_12-123.312/cat-_-cat/cat/dog---I

даст 404 ошибки так нужна в 301- переадресация:

http://www.example.com/cat/cat2/200-AB-a-12-12-123.312/cat-cat/cat/dog-I

Таким образом, все символы подчеркивания должны быть заменены дефисом, и должен быть только один дефис.

короткая версия: заменить --- на - и заменить _ на - , но заменяя _ на - это -_- станет --- и правилом нужно будет снова позвонить.

Возможно ли это в одном правиле? а если не так, как это сделать по-другому:) я не имею ни малейшего представления о том, как сделать это с помощью Nginx

любая помощь оценила :)

+1

Я думаю, что это будет гораздо более гибким, если вы это на стороне приложения, а не на стороне nginx. –

+0

Вам понадобится рекурсивная переписывание, перезаписи nginx являются рекурсивными, вам нужно найти правильный способ сделать это менее чем за 10 циклов. – regilero

+0

Я понимаю, что переписать можно было бы в два этапа. сначала замените подчеркивание на дефис, а затем замените несколько дефисов на один. но я абсолютно не знаю, как это сделать. извините за это;/ – user2025805

ответ

1
% nginx -c $PWD/test.conf 
% curl -I localhost:8080/cat/cat2/200-AB---a-12_12-123.312/cat-_-cat/cat/dog---I 
HTTP/1.1 301 Moved Permanently 
Server: nginx/1.3.13 
Date: Wed, 20 Feb 2013 00:09:50 GMT 
Content-Type: text/html 
Content-Length: 185 
Location: http://localhost:8080/cat/cat2/200-AB-a-1212-123.312/cat-cat/cat/dog-I 
Connection: keep-alive 

% cat test.conf 
events { } 

#error_log logs/error.log debug; 

http { 
    server { 
     listen 8080; 
     location /cat/cat2/ { 
      # replace up to 3 inconsecutive 
      # uderscores per internal redirect 
      rewrite "^(.+?)_+(?:(.+?)_+)?(?:(.+?)_+)?(.+)$" $1$2$3$4 last; 

      # replace up to 3 inconsecutive multiple 
      # hyphens per internal redirect 
      rewrite "^(.+?-)-+(?:(.+?-)-+)?(?:(.+?-)-+)?(.+)$" $1$2$3$4 last; 

      return 301 $uri; 
     } 
    } 
} 
+0

ОК, но вы пробовали очень длинный URL-адрес с множеством подруг? Nginx запускает ошибку рекурсии? нет ли способа сделать выражение regex, соответствующее бесконечному числу замен? – regilero

+0

Итак, имея 3 замены на итерацию, эта конфигурация может обрабатывать URL-адреса с 30 фрагментами, разделенными любым количеством дефиса или подчеркивания. Чтобы работать с «бесконечным числом замен», у вас должны быть бесконечные ресурсы и бесконечное время. – VBart