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

Условная перезапись прокси-сервера Apache2 fastcgi с сопоставлением прокси-сервера и cookie

Сейчас у меня два проекта:

  1. /home/piotrek/Vhosts/sf.local/web/app_dev.php
  2. /home/piotrek/Vhosts/sf2.local/web/app_dev.php

Оба имеют одинаковое репо, но настроены на две разные ветки.

У меня есть vhost для первого сайта:

<VirtualHost *:80>
    ServerName sf.local
    ServerAlias www.sf.local

    DocumentRoot /home/piotrek/Vhosts/sf.local/web

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9071/home/piotrek/Vhosts/sf.local/web/$1

    DirectoryIndex app_dev.php

    <Directory /home/piotrek/Vhosts/sf.local/web>
        AllowOverride All
        Require all granted
        Options -MultiViews

        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ app_dev.php [QSA,L]

        </IfModule>
    </Directory>

    ErrorLog /home/piotrek/Vhosts/logs/sf.local-error.log
    CustomLog /home/piotrek/Vhosts/logs/sf.local-access.log combined

</VirtualHost>

Когда я прошу http: //sf.local/ все работает нормально. Но теперь я хочу отправить людей на /sf2.local/, когда есть cookie с именем THEME устанавливать. Что-то вроде этого:

RewriteCond %{HTTP_COOKIE} THEME=new [NC]
RewriteRule ^(.*)$ sf2project

Как я могу объединить перезапись мода с прокси-сервером fastcgi для сервера одного сайта, когда нет файлов cookie, а другого, когда установлены файлы cookie?

Хорошо, вот я и разобрался.

Vhost должен выглядеть так:

<VirtualHost *:80>
    ServerName sf.local
    ServerAlias www.sf.local

    DocumentRoot /home/piotrek/Vhosts

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9071/home/piotrek/Vhosts/$1

    <Directory /home/piotrek/Vhosts>
        AllowOverride None
        Require all granted

        <IfModule mod_rewrite.c>
            Options -MultiViews
            RewriteEngine On

            # rewrite if cookie is set to "new"
            RewriteCond %{HTTP_COOKIE} THEME=new [NC]
            RewriteRule ^(.*)$ sf2.local/web/$1 [QSA,L]

            # rewrite to old version
            RewriteRule ^(.*)$ sf.local/web/$1 [QSA,L]
        </IfModule>

    </Directory>

    <Directory /home/piotrek/Vhosts/sf.local/web>

        <IfModule mod_rewrite.c>
            # local rewrite to app_dev.php if file does not exists
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ app_dev.php [QSA,L]
        </IfModule>

    </Directory>

    <Directory /home/piotrek/Vhosts/sf2.local/web>

        <IfModule mod_rewrite.c>
            # local rewrite to app_dev.php if file does not exists
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ app_dev.php [QSA,L]
        </IfModule>

    </Directory>

    ErrorLog /home/piotrek/Vhosts/logs/sf.local-error.log
    CustomLog /home/piotrek/Vhosts/logs/sf.local-access.log combined

</VirtualHost>

/home/piotrek/Vhosts/sf.local/web/app_dev.php

<?php
setcookie("THEME", "new", time() + 3600);

die('OLD THEME');

/home/piotrek/Vhosts/sf2.local/web/app_dev.php

<?php

die('NEW THEME');

Теперь, когда я вхожу http: //sf.local/ первый раз,

  1. запрос переписан на sf.local/web/app_dev.php
  2. ProxyPassMatchобрабатывает запрос к каталогу старой темы fcgi://127.0.0.1:9071/home/piotrek/Vhosts/sf.local/web/app_dev.php
  3. cookie установлен
  4. OLD THEME отображается

После обновления

  1. запрос переписан на sf2.local/web/app_dev.php
  2. ProxyPassMatch обрабатывает запрос к новому каталогу темы fcgi://127.0.0.1:9071/home/piotrek/Vhosts/sf2.local/web/app_dev.php
  3. NEW THEME отображается

Перезапись также работает для других файлов, например http: //sf.local/robots.txt. Без cookie он переписывается на /home/piotrek/Vhosts/sf.local/web/robots.txt и с cookie в /home/piotrek/Vhosts/sf2.local/web/robots.txt