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?

1 ответ

Решение

Итак, я понял это.

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. печенье установлено
  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. Без куки переписывается /home/piotrek/Vhosts/sf.local/web/robots.txt и с cookie для /home/piotrek/Vhosts/sf2.local/web/robots.txt

Другие вопросы по тегам