Вы могли решить, что статус выхода 77, например, средства выходит из любого уровня подоболочки и делает
set -E
trap '[ "$?" -ne 77 ] || exit 77' ERR
(
echo here
(
echo there
(
exit 12 # not 77, exit only this subshell
)
echo ici
exit 77 # exit all subshells
)
echo not here
)
echo not here either
set -E
в сочетании с ERR
прерывания немного похожи на улучшенную версию set -e
в этом это позволяет Вам определять свою собственную обработку ошибок.
В zsh ДОПУСТИТЕ ОШИБКУ, прерывания наследованы автоматически, таким образом, Вам не нужно set -E
, можно также определить прерывания как TRAPERR()
функции, и изменяют их через $functions[TRAPERR]
, как functions[TRAPERR]="echo was here; $functions[TRAPERR]"
По сравнению с ответом slm, имея необходимость поддержать два различных места (iptables и апач) и также давая побочный эффект неспособности посетить / на localhost:3280, я использовал бы просто Apache для достижения результата. Это будет служить ElasticSearch через / на 3 000 (и не "перенаправлять" пользователя к localhost:3280/some/long/url - изменение, какой URL появляется на браузере). Это решение обрабатывает и шаг № 4 и № 7 сразу (приложения в № 7 могут перенаправить трафик к другому дюйм/с на уровне № 4).
Если Вы имеете mod_proxy
загруженный в Вашем Apache можно изменить порт 3000<VirtualHost>
(Я предполагаю, что это использует *
а не 127.0.0.1 в virtualhost объявлении):
<VirtualHost *:3000>
.
.
.
RewriteEngine On
ProxyPass / http://127.0.0.1:3280/some/long/url
ProxyPassReverse / http://127.0.0.1:3280/some/long/url
</VirtualHost>
Править: Корректный, что правило должно быть на 3 000 и proxypass к 3 280, разъясните различия к предложению slm и удалите точку об изменении 127.0.0.1 в ProxyPass (поскольку это - virtualhost отрывок, точно, что спрашивают в исходном вопросе).
Ссылки:
Документация Apache Директивы Virtualhost и документация Apache Директивы ProxyPass.
Можно использовать следующие 2 правила сделать то, что Вы хотите:
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 3000 -j REDIRECT \
--to-port 3280
$ sudo iptables -t nat -A OUTPUT -p tcp -d 127.0.0.0/8 --dport 3000 -j REDIRECT \
--to-port 3280
Если Вы захотите получить доступ к этому за пределами localhost затем, то необходимо будет добавить это правило с помощью IP-адреса хоста (принимающий 192.168.1.10):
$ sudo iptables -t nat -A OUTPUT -p tcp -d 192.168.1.10 --dport 3000 \
-j REDIRECT --to-port 3280
/ -> /some/long/url
Это может быть выполнено с помощью переписать правила в Apache. Это может быть добавлено к Apache httpd.conf
файл, например:
RewriteEngine on
RewriteRule ^$ /some/long/url [R=301,L]
Итак, почему Вам нужно iptables
и Apache? Это имеет отношение к модели OSI. Модель OSI содержит 7 слоев.
7. Приложение (Сеть обрабатывают к приложению),
6. Презентация (Представление данных, шифрование и дешифрование, преобразовывают зависимые данные машины в независимые от машины данные),
5. Сессия (коммуникация Межхоста, руководящие сессии между приложениями)
4. Транспорт - (Сквозные соединения, надежность и управление потоком)
3. Сеть - (Определение пути и логическое обращение)
2. Канал передачи данных - (Физическая адресация)
1. Физический - (Медиа, предупредите и двоичная передача),
iptables
соглашения с № 4, в то время как Apache имеет дело с данными на уровне № 7. Думайте о данных как о похожении на конверт. За пределами конверта содержит адрес того, куда поставить (это - порт #). Это было бы уровнем № 4 в модели OSI.
Содержанием конверта (HTTP + URL) должен управлять Apache на уровне № 7.
/
кому: /some/long/url
. Я не понял, что Вы буквально хотели перенаправить URL + порт.
– slm♦
01.08.2013, 04:19
iptables
может только иметь дело с информацией за пределами конверта, тогда как Apache/Nginx имеют дело с листком бумаги, который это в конверте.
– slm♦
01.08.2013, 04:34