Зеркально отразите localhost:3280/some/long/url к localhost:3000

Вы могли решить, что статус выхода 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]"

0
01.08.2013, 04:59
2 ответа

По сравнению с ответом 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
28.01.2020, 02:21

Перенаправление порта

Можно использовать следующие 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]

Почему 2 инструмента?

Итак, почему Вам нужно iptables и Apache? Это имеет отношение к модели OSI. Модель OSI содержит 7 слоев.

7. Приложение (Сеть обрабатывают к приложению),

6. Презентация (Представление данных, шифрование и дешифрование, преобразовывают зависимые данные машины в независимые от машины данные),

5. Сессия (коммуникация Межхоста, руководящие сессии между приложениями)

4. Транспорт - (Сквозные соединения, надежность и управление потоком)

3. Сеть - (Определение пути и логическое обращение)

2. Канал передачи данных - (Физическая адресация)

1. Физический - (Медиа, предупредите и двоичная передача),

iptables соглашения с № 4, в то время как Apache имеет дело с данными на уровне № 7. Думайте о данных как о похожении на конверт. За пределами конверта содержит адрес того, куда поставить (это - порт #). Это было бы уровнем № 4 в модели OSI.

Содержанием конверта (HTTP + URL) должен управлять Apache на уровне № 7.

Ссылки

2
28.01.2020, 02:21
  • 1
    Спасибо за решение половины моей проблемы. Теперь localhost:3000 зеркально отражает localhost:3280. Однако, как я могу заставить localhost:3000 зеркально отразить localhost:3280/some/long/url? –  Dávid Natingga 01.08.2013, 04:16
  • 2
    @dt1510 - iptables не может сделать перенаправлений URL. Необходимо будет включить в список или Apache или Nginx к к перенаправлению / кому: /some/long/url. Я не понял, что Вы буквально хотели перенаправить URL + порт. –  slm♦ 01.08.2013, 04:19
  • 3
    Но я хотел бы зеркально отразить, вместо того, чтобы перенаправить, пользователь (на самом деле сценарий) должен видеть URL localhost:3000, хотя он относится к другому. Apache может сделать это? Отметьте, я хочу, избавляются от/some/long/url, скорее затем добавляют его. –  Dávid Natingga 01.08.2013, 04:24
  • 4
    @dt1510 - Ваша терминология не является правильной. Нет такой вещи как зеркальное отражение. Я знаю то, что Вы просите, но единственный способ сделать это состоит в том, чтобы перенаправить трафик в порте X к порту Y с помощью iptables. Действовать на URL требует, чтобы и/или веб-сервер прокси переписал/перенаправил URL к другому. Не уверенный, если Вы знакомы, но это имеет отношение к модели OSI: en.wikipedia.org/wiki/OSI_model –  slm♦ 01.08.2013, 04:30
  • 5
    @dt1510 - думает о нем как конверт в почте. iptables может только иметь дело с информацией за пределами конверта, тогда как Apache/Nginx имеют дело с листком бумаги, который это в конверте. –  slm♦ 01.08.2013, 04:34

Теги

Похожие вопросы