Назад | Перейти на главную страницу

Apache Rewrite или прокси на внутренний сервер

Во-первых, это моя первая попытка использовать apache, так что, пожалуйста, простите меня за мою начальную оригинальность :)

Моя базовая настройка такова: mysub.domain.com отправляется на мой статический IP-адрес через запись CNAME в диспетчере DNS godaddy. Он попадает на мой сервер Ubuntu 10 LTS с Apache2.

У меня есть запись виртуального хоста, которая направляет этот запрос на соответствующий /var/www/mysub папка. У меня нет никакого контента, но я добавил строку на страницу «Это работает», чтобы знать, успешно ли я попал туда. У меня также есть Mac Mini с вики-сервером в той же локальной сети, что и сервер Ubuntu.

мне бы хотелось mysub.domain.com попасть на мой мини-сервер вместо /var/www/mysub папка.

После долгого чтения на этом и других сайтах мне удалось это сделать ... вроде как.

У меня в моем /var/www/mysub/.htacess, который я нашел в другом вопросе по SF (забыл скопировать ссылку).

RewriteEngine on
RewriteCond %{HTTP_HOST} ^mysub.domain.com/*
RewriteRule .* http://192.168.x.x/ [P,L]

Это работает настолько, что перенаправляет mysub.domain.com на главную страницу Mini. Но, конечно, то же самое происходит с каждой последующей ссылкой на мини-страницу. Думаю, я понимаю, почему он это делает (все, что начинается с mysub.domain.com направляется на то, что по сути является главной страницей вики-сервера, и поскольку последующие ссылки на вики-сервере также включают mysub.domain.com, он всегда оказывается в одном и том же месте)

Я просто не знаю, что делать иначе. Честно говоря, я действительно не понимаю синтаксис этих строк Rewrite.


Я видел бесчисленное количество примеров конфигурационных записей и пробовал некоторые из них, но без особого понимания синтаксиса это своего рода стрельба в темноте.

это был полезный пост, и после прочтения этот вопрос, я попытался добавить это в свой /apache2/httpd.conf файл

<Location />
   ProxyPass http://192.168.x.x
   ProxyPassReverse http://192.168.x.x
</Location>

Не повезло.

Ясно, что мне нужно чему-то научиться, но мне кажется, что то, что я хочу делать, вероятно, довольно просто. Что мне не хватает?


ИЗМЕНИТЬ КОММЕНТАРИИ

Мой /etc/apache2/httpd.conf файл

ServerName localhost

<VirtualHost *:80>
   ServerName domain.com
   ServerAlias www.domain.com
   DocumentRoot /var/www/domain
</VirtualHost>

<VirtualHost *:80>
   ServerName mysub.domain.com
   DocumentRoot /var/www/mysub
   <Location />
      ProxyPass http://192.168.x.x/
      ProxyPassReverse http://192.168.x.x/
   </Location>
</VirtualHost>

... и мой sites-available/mysub файл...

<VirtualHost *:80>
        ServerAdmin me@domain.com
        ServerName mysub.domain.com
        DocumentRoot /var/www/mysub

        #ProxyRequests Off
        <Location />
                ProxyPass http://192.168.1.50/
                ProxyPassReverse http://192.168.1.50/
        </Location>
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/mysub>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/www/mysub/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

Выход apache2ctl -S

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server 66-152-109-110.tvc-ip.com (/etc/apache2/sites-enabled/000-default:1)
         port 80 namevhost 66-152-109-110.tvc-ip.com (/etc/apache2/sites-enabled/000-default:1)
         port 80 namevhost domain.com (/etc/apache2/sites-enabled/domain:1)
         port 80 namevhost mysub.domain.com (/etc/apache2/sites-enabled/mysub:1)
Syntax OK

Вы очень близки!

Пара заметок:

  • RewriteCond %{HTTP_HOST} ^mysub.domain.com/* - The HTTP_HOST переменная содержит только mysub.domain.com, а не остаток пути.

    Это правило действительно совпадает, но случайно - нет / характер есть, но * модификатор применяется к / символ, означающий "повторить / От 0 до бесконечности ».

    Apache использует Perl-совместимое регулярное выражение - чтобы соответствовать точному хосту, оно должно выглядеть так:

    RewriteCond %{HTTP_HOST} ^mysub\.domain\.com$
    
  • RewriteRule .* http://192.168.x.x/ [P,L] - Это только загрузка домашней страницы, так как она не включает остальную часть пройденного пути - это необходимо сделать вручную при использовании [P] флаг RewriteRule.

    Это должно работать:

    RewriteRule (.*) http://192.168.x.x/$1 [P,L]
    
  • В ProxyPass настройка почти правильная, за исключением того, что она отменяется настройкой в .htaccess файл, поэтому он не используется. С помощью .htaccess плохо для производительности и потенциально проблематично для безопасности - см. рекомендацию в документации Apache Вот.

    Вероятно, лучший подход - удалить .htaccess файл сразу, и просто используйте ProxyPass. Измените немного свою конфигурацию ...

    <Location />
       ProxyPass http://192.168.x.x/
       ProxyPassReverse http://192.168.x.x/
    </Location>
    

    ... и переместите его из своего httpd.conf в пределах <VirtualHost> блок, обслуживающий субдомен.

    С соответствующими косыми чертами в конце и не более .htaccess, это должно помочь!

Это был последний кусок головоломки. Нашел как ответ на этот вопрос.

Решение состоит в том, чтобы иметь это в /etc/apache2/mods-enabled/proxy.conf:

<IfModule mod_proxy.c>
ProxyRequests Off
<Proxy *>
  AddDefaultCharset off 
  Order deny,allow
  Allow from all 
</Proxy>