Сегодня столкнулся с проблемой — обнаружилось, что по ошибке старого системного администратора, в одном очень редком случае у нас происходил редирект с обычного 80 порта на порт 8080.
Из-за этого в индекс яндекса попала целая куча страниц, имеющих адрес example.com:8080, потому что проблема существовала уже 3 года, а заметили ее только сейчас.
Проблема усугублялась тем, что сервер конфигурировался автоматически с помощью ISP manager, что привело к тому, что сайты были доступны как по адресу example.com, так и по example.com:8080, и с учетом того, что к серверу было привязано 5 ip-адресов и на нем крутилось около 20 сайтов, переконфигурировать все вручную чтобы сконфигурировать правильным способом апач и nginx (сделать, чтобы апач слушал только 127.0.0.1 и чтобы они висели на одном порту с nginx, а внешние адреса слушал только nginx) не представлялось возможным. Проблеме потенциально подвержены все сайты, которые пользуются ISP manager, поэтому я считаю ее достаточно актуальной, и решил опубликовтаь свое решение, чтобы все тоже проверили и исправили, если надо.
Соответственно стояла задача — «малой кровью» сделать:
1. чтобы сайт example.com корректно работал, но не открывался по адресу example.com:8080
2. чтобы с порта 8080 для одного определенного сайта шел редирект на 80 порт, чтобы сохранить работоспособность страниц, попавших в выдачу яндекса.
Перейти сразу к ответу, без предыстории
Беглое гугление не показало ничего хорошего, большинство способов были аналогичны способу с iptables, предложенному тут:
iptables -A INPUT -p tcp -m tcp --dport 8080 -j REDIRECT --to-ports 80
Проблема в том, что этот способ не работает — dmesg выдает
ip_tables REDIRECT target: only valid in nat table, not filter.
После небольшого гугления нашел вариант в списке рассылки nginx-ru:
www.lexa.ru/nginx-ru/msg21134.html
Вариант был такой — перевесить в apache.conf мой сайт с моего ip 11.22.33.44:8080 на 127.0.0.1:8080, в nginx.conf соответсвенно прописать proxy_pass 127.0.0.1:8080 вместо 11.22.33.44:8080 для моего сайта, и потом добавить в конфиг nginx новый сервер
server { listen 11.22.33.44:8080; rewrite ^/(.*)$ http://$host:80/$1 redirect; }
Вариант в принципе был похож на правду, но была одна проблема — апач упорно слушал порт 11.22.33.44:8080, и соответсвенно не давал nginx-у начать его слушать.
Тут меня осенило — можно просто взять, и реализовать такой же редирект, но средствами apache а не nginx.
Просто берем и добавляем в apache2.conf соответствующий VirtualHost:
<VirtualHost 11.22.33.44:8080> ServerName example.com Redirect 301 / http://example.com/ </VirtualHost>
Попробовал — и вуаля, все заработало!
Решение проблемы
Таким образом, решение проблемы "как сделать редирект с 8080 порта на 80", при условии что у вас стоит debian, nginx, apache и все это настроено isp-менеджером для сайта example.com с ip 11.22.33.44, состоит из четырех простых шагов:
1. В конфиге Apache (/etc/apache2/apache2.conf) меняем все вхождения
Virtual Host 11.22.33.44:8080
на
VirtualHost 127.0.0.1:8080
2. Добавляем в конфиг Apache (/etc/apache2/apache2.conf) новый VirtualHost с редиректом:
<VirtualHost 11.22.33.44:8080> ServerName example.com Redirect 301 / http://example.com/ </VirtualHost>
3. В конфиге nginx (/etc/nginx/nginx.conf) меняем все вхождения
proxy_pass http://11.22.33.44:8080
на
proxy_pass http://127.0.0.1:8080
4. перезапускаем apache, перезапускаем nginx
/etc/init.d/apache2 restart /etc/init.d/nginx restart
Автор: rednaxi