Доброе время суток. Возникла интересная задача, но методов решения не могу найти.Есть шлюз(Fedora 10) с белым ip, за ним в локальной сети машина server-db с адресом 192.168.2.2. На server-db стоит Microsoft SQL Server 2005: Reporting Services. Служит для просмотра отчётов клиентами через WEB. Изнутри сети всё хорошо работает. Снаружи я дал доступ на server-db через Apache с помощью mod_proxy. Однако при нажатии юзером из внешней сети на ссылки вида http://server-db/Reports/Pages/Folder.aspx браузер выдаёт "Невозможно отобразить страницу". Ну это очевидно, ведь "server-db" - это локальное имя компа. Мне бы как-то сделать, чтобы Apache в содержимом выдаваемых страниц менял "server-db" на белый ip?
А может и вовсе есть более простой вариант? Порт пробрасывать напрямую не хочется, вдруг в будущем появится ещё один сервис на 80 порту.
Тут надо смотреть в настройки этого "Microsoft SQL Server 2005: Reporting Services" как там менять домен. Если никак - тогда можно написать самому или где нибудь скачать какой-нибудь php скрипт который будет менять url.>А может и вовсе есть более простой вариант? Порт пробрасывать напрямую не
>хочется, вдруг в будущем появится ещё один сервис на 80 порту.Прописать у всех пользователей в hosts белый ip для server-db и создать в apache виртуальный домен для server-db, а с apache передавать запросы на реальный server-db.
Но на мой взгляд кроме первого способа остальные не слишком красивые решения, мягко говоря.
>Прописать у всех пользователей в hosts белый ip для server-db и создать
>в apache виртуальный домен для server-db, а с apache передавать запросы
>на реальный server-db.
>
>Но на мой взгляд кроме первого способа остальные не слишком красивые решения,
>мягко говоря.Да нет, вы что. Я же не знаю этих пользователей. Они из Интернета будут смотреть отчёты.
или писать свой скрипт-прослойку, через который будут идти все запросы на MSSql
или воспользоваться http://www.webthing.com/software/mod_proxy_html/http://httpd.apache.org/docs/2.0/mod/mod_proxy.html
Only the HTTP response headers specifically mentioned above will be rewritten. Apache will not rewrite other response headers, nor will it rewrite URL references inside HTML pages. This means that if the proxied content contains absolute URL references, they will by-pass the proxy. A third-party module that will look inside the HTML and rewrite URL references is Nick Kew's mod_proxy_html.
>
>или воспользоваться http://www.webthing.com/software/mod_proxy_html/
>Спасибо большое за наводку. Скорее воспользуюсь mod_proxy_html
C mod_proxy_html не получилось. Модуль скомпилил, установил.
Вот с таким фрагментом замена абсолютных ссылок не происходит. Наверное потому, что странички то *.aspx, а не html )
-----------------------------------------
<VirtualHost *:80>
DocumentRoot /
ProxyHTMLLogVerbose On
ProxyRequests Off
ProxyHTMLEnable On
ProxyPass / http://192.168.2.2/
ProxyPassReverse / http://192.168.2.2/
#SetOutputFilter proxy-html
ProxyHTMLURLMap http://192.168.2.20/ /
RequestHeader unset Accept-Encoding
</VirtualHost>-----------------------------------------
Решил сделать через nginx.
Пытаюсь настроить nginx как обратный прокси. Это мне нужно для того, чтобы дать пользователям доступ из внешней сети к Microsoft Reporting Services по http. Reporting Services находится на внутреннем сервере 192.168.2.2. Nginx установил, как прокси он работает, но вот ссылки в выдаваемом содержимом не подменяет (за подмену отвечает mod_sub). Т.е. на сайте есть ссылка: http://server-db/Reports/Pages/Folder.aspx. Надо, чтобы в выдаваемой странице ссылка стала такой: http:/87.241.*.*/Reports/Pages/Folder.aspxМой конфиг:
#------------------------------------------
worker_processes 1;
pid logs/nginx.pid;events {
worker_connections 1024;
}http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;server
{
listen 80;
server_name localhost;location /
{
proxy_pass http://192.168.2.2:80;
proxy_redirect http://server-db/ http://87.241.*.*/;
sub_filter server-db 87.241.*.*;
sub_filter_once off;
root html;
index index.html index.htm ;
}error_page 500 502 503 504 /50x.html;
location = /50x.html
{
root html;
}
}#------------------------------------------
Это вообще реально сделать?
>Мне бы как-то сделать, чтобы Apache в содержимом выдаваемых страниц менял "server-db" на белый ip?
>
>А может и вовсе есть более простой вариант? Порт пробрасывать напрямую не
>хочется, вдруг в будущем появится ещё один сервис на 80 порту.что там за внешние пользователи такие, что им через mod_proxy удобнее, чем через отдельный порт..
апачи в содержимом врядли что-то сможет поменять. он не на то рассчитан. он просто отдаёт контент
можете использовать mod_rewrite. правило на запросы от внешних IP
также можете менять содержимое через perl или php
тупо весь народ через .htaccess, например, слать на скрипт, он уже разберётся
>что там за внешние пользователи такие, что им через mod_proxy удобнее, чем
>через отдельный порт..Дело не в пользователях. Если я тупо проброшу порт на внутреннюю машину, то при появлении ещё одной машины, которой нужен будет доступ по 80 порту извне придётся снова вернуться к этому вопросу.
>апачи в содержимом врядли что-то сможет поменять.
Может вроде как. Модуль называется mod_proxy_html
>mod_rewrite
Этот модуль не умеет менять СОДЕРЖИМОЕ html-страниц.
>>mod_rewrite
>
>Этот модуль не умеет менять СОДЕРЖИМОЕ html-страниц.зато может подсовывать другие страницы
просто надо 2 разных страницы будет иметь
в свете поставленной задачи вполне сойдёт за вариантP.S. а вариант размещения всех своих внутренних сайтов на одном апаче не рассматривали? а выделение отдельного порта под отдельный сайт, не?
по какому вообще принципу пользователей разделяете на разные сервера внутри сети?
точнее говоря, в свете поставленной задачи, это выглядит так:
http://server-db/Reports/Pages/Folder.aspx меняется на http://212.101.55.12/Reports/Pages/Folder.aspx