2017-02-19 9 views
0

Мне нужно переписать удаленный URL-адрес на локальный порт (есть приложение, которое его прослушивает).Предотвратите ngnix, чтобы попробовать решить удалить URL-адрес на местном уровне

Мой конфиг:

server { 
     listen  80; 
     server_name mysite.org; 

     location /foo { 
      proxy_pass http://127.0.0.1:8080; 
     } 
    } 

Теперь, когда я получить доступ к /foo Nginx пытается найти /foo путь в моем локальном приложении. Вроде: http://127.0.0.1:8080/foo. Но мне нужно заставить их не пытаться получить этот путь, а просто переписать на http://127.0.0.1:8080.

Как я могу это сделать?

P.S. Я попытался добавить хвост слэш на http://127.0.0.1:8080/;, но это не помогло.

ответ

0

Добавляя завершающую / к proxy_pass вы создаете отображение /foo к /, который не будет работать для другой URI. Например, /foo/bar будет отображаться на //bar. Вы можете решить эту проблему, используя location /foo/ { ... }, но тогда URI /foo не будет работать и потребуется отдельное исправление.

В качестве альтернативы использованию функции proxy_pass для выполнения функции сглаживания вместо этого можно использовать rewrite ... break. См. this document для получения дополнительной информации.

Try:

location /foo { 
    rewrite ^/foo(?:/(.*))?$ /$1 break; 
    proxy_pass http://127.0.0.1:8080; 
} 

Регулярное выражение захватывает что-нибудь после того, как /foo/, но и позволяет /foo быть отображены на /. Она разбита как:

1^ anchor beginning of line 
2 /foo part of URI we need to remove 
3 (?: begin non-capturing group 
4/ part of URI which is optional 
5 (.*) capture anything that must be used to create mapped URI 
6 )? close non-capturing group and make it optional 
7 $  anchor end of line 

Мы хотим $1 представлять все захваченное в шаге 5, следовательно, использование не-захвата групп. Мы могли бы использовать обычные захваты и перенумеровать $1 в $2.

См. Это useful resource on regular expressions.

+0

Не могли бы вы объяснить, что 'rewrite ^/foo (?:/(. *))? $/$ 1 break;' do? –