Псевдоним и mod_rewrite

Я пытаюсь заставить Symfony1.4 и Symfony2 работать на одном хосте в Apache (2.2.22) - я думаю, проблема в том, что оба используют mod_rewrite для направления запроса на php-контроллер/скрипт. Вот моя конфигурация

httpd.conf

# Symfony 1.4
<VirtualHost *:80>
  DocumentRoot "d:/wamp/www/wlnew/web"
  DirectoryIndex index.php
  <Directory "d:/wamp/www/wlnew/web">
    AllowOverride All
    Allow from All
  </Directory>

  Alias /sf d:/wamp/www/wlnew/lib/vendor/symfony/data/web/sf
  <Directory "d:/wamp/www/wlnew/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>
# Symfony 2
Alias /another "d:/wamp/www/another/web/"
<Directory "d:/wamp/www/another/web">
    Options Indexes FollowSymlinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

И затем каждая версия Symfony имеет .htaccess, который используется для повторной записи запроса.

Симфония 1 .htaccess

Options +FollowSymLinks +ExecCGI
<IfModule mod_rewrite.c>
  RewriteEngine On

  RewriteRule ^$ index.html [QSA]
  RewriteRule ^([^.]+)$ $1.html [QSA]
  RewriteCond %{REQUEST_FILENAME} !-f

  # no, so we redirect to our front web controller
  RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

Симфония 2 .htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>

Я хочу иметь возможность использовать localhost/ для перенаправления на фронт-контроллер Symfony 1 index.php, но когда я использую localhost/another, все запросы должны перенаправляться на фронт-контроллер symfony2 app.php, но это не так - они перенаправляются на фронт-контроллер symfony1 (index.php). Если я использую имя файла контроллера для Symfony2, он работает, т.е. localhost/another/app.php

Как я могу заставить apache перенаправлять запросы на контроллер Symfony2, когда я использую псевдоним /another?

Обновлять

Я включил ведение журнала перезаписи... вот что я получил:

[perdir D:/wamp/www/another/web/] strip per-dir prefix: D:/wamp/www/another/web/ -> 
[perdir D:/wamp/www/another/web/] applying pattern '^(.*)$' to uri ''
[perdir D:/wamp/www/another/web/] RewriteCond: input='D:/wamp/www/another/web/' pattern='!-f' => matched
[perdir D:/wamp/www/another/web/] rewrite '' -> 'app.php'
[perdir D:/wamp/www/another/web/] add per-dir prefix: app.php -> D:/wamp/www/another/web/app.php
[perdir D:/wamp/www/another/web/] internal redirect with D:/wamp/www/another/web/app.php [INTERNAL REDIRECT]
[perdir D:/wamp/www/wlnew/web/] add path info postfix: D:/wamp/www/wlnew/web/wamp -> D:/wamp/www/wlnew/web/wamp/www/another/web/app.php
[perdir D:/wamp/www/wlnew/web/] strip per-dir prefix: D:/wamp/www/wlnew/web/wamp/www/another/web/app.php -> wamp/www/another/web/app.php
[perdir D:/wamp/www/wlnew/web/] applying pattern '^$' to uri 'wamp/www/another/web/app.php'
[perdir D:/wamp/www/wlnew/web/] add path info postfix: D:/wamp/www/wlnew/web/wamp -> D:/wamp/www/wlnew/web/wamp/www/another/web/app.php
[perdir D:/wamp/www/wlnew/web/] strip per-dir prefix: D:/wamp/www/wlnew/web/wamp/www/another/web/app.php -> wamp/www/another/web/app.php
[perdir D:/wamp/www/wlnew/web/] applying pattern '^([^.]+)$' to uri 'wamp/www/another/web/app.php'
[perdir D:/wamp/www/wlnew/web/] add path info postfix: D:/wamp/www/wlnew/web/wamp -> D:/wamp/www/wlnew/web/wamp/www/another/web/app.php
[perdir D:/wamp/www/wlnew/web/] strip per-dir prefix: D:/wamp/www/wlnew/web/wamp/www/another/web/app.php -> wamp/www/another/web/app.php
[perdir D:/wamp/www/wlnew/web/] applying pattern '^(.*)$' to uri 'wamp/www/another/web/app.php'
[perdir D:/wamp/www/wlnew/web/] RewriteCond: input='D:/wamp/www/wlnew/web/wamp' pattern='!-f' => matched
[perdir D:/wamp/www/wlnew/web/] rewrite 'wamp/www/another/web/app.php' -> 'index.php'
[perdir D:/wamp/www/wlnew/web/] add per-dir prefix: index.php -> D:/wamp/www/wlnew/web/index.php
[perdir D:/wamp/www/wlnew/web/] strip document_root prefix: D:/wamp/www/wlnew/web/index.php -> /index.php
[perdir D:/wamp/www/wlnew/web/] internal redirect with /index.php [INTERNAL REDIRECT]
[perdir D:/wamp/www/wlnew/web/] strip per-dir prefix: D:/wamp/www/wlnew/web/index.php -> index.php
[perdir D:/wamp/www/wlnew/web/] applying pattern '^$' to uri 'index.php'
[perdir D:/wamp/www/wlnew/web/] strip per-dir prefix: D:/wamp/www/wlnew/web/index.php -> index.php
[perdir D:/wamp/www/wlnew/web/] applying pattern '^([^.]+)$' to uri 'index.php'
[perdir D:/wamp/www/wlnew/web/] strip per-dir prefix: D:/wamp/www/wlnew/web/index.php -> index.php
[perdir D:/wamp/www/wlnew/web/] applying pattern '^(.*)$' to uri 'index.php'
[perdir D:/wamp/www/wlnew/web/] RewriteCond: input='D:/wamp/www/wlnew/web/index.php' pattern='!-f' => not-matched
[perdir D:/wamp/www/wlnew/web/] pass through D:/wamp/www/wlnew/web/index.php

Кажется, что .htaccess для Symfony2 (/another) читается и перенаправляется на app.php, но затем читает другие .htaccess и затем перенаправляет на index.php... Как я могу заставить переписать остановиться на app.php


person Manse    schedule 22.01.2013    source источник
comment
Что, если вы переместите свой псевдоним для sf2 поверх вашего файла conf?   -  person cheesemacfly    schedule 22.01.2013
comment
@cheesemacfly без разницы :-(   -  person Manse    schedule 22.01.2013
comment
Одинаковое поведение для localhost/another и localhost/another/?   -  person cheesemacfly    schedule 22.01.2013
comment
@cheesemacfly да - похоже, проблема связана с Symfony 1 .htaccess - он не может найти файл, поэтому перенаправляется на index.php, по какой-то причине псевдоним игнорируется.   -  person Manse    schedule 22.01.2013
comment
На первый взгляд, я вижу, что ваш Alias /another "d:/wamp/www/another/web/" имеет завершающую косую черту для каталога, а ваше объявление директивы <Directory "d:/wamp/www/another/web"> - нет. Хотя на 1.4 все нормально. Может быть? :)   -  person Nandeep Mali    schedule 29.01.2013
comment
Хотя косая черта в конце не влияет на директиву Directory. Это важно только для других директив, таких как DocumentRoot и Location.   -  person Nandeep Mali    schedule 29.01.2013
comment
@NandeepMali Я пробовал все комбинации косой черты - все равно без радости - я думаю, проблема в нескольких файлах .htaccess - я включил журнал   -  person Manse    schedule 29.01.2013
comment
Я полагал. Как я писал во втором комментарии, это не должно иметь значения. Но вы можете попробовать это: gist.github.com/9488026f5cefd8ccee3c (добавлено в суть, потому что ответ длинный но не уверен, так как нет машины, чтобы попробовать).   -  person Nandeep Mali    schedule 29.01.2013
comment
Просто немного обновил суть.   -  person Nandeep Mali    schedule 29.01.2013
comment
@NandeepMali Я думаю, вы могли бы что-то здесь понять - сейчас проверим.   -  person Manse    schedule 29.01.2013
comment
@NandeepMali добавление RewriteCond %{REQUEST_URI} !=/app.php не имело значения, я изменил его на RewriteCond %{REQUEST_URI} !=D:/wamp/www/wlnew/web/wamp то же самое ..   -  person Manse    schedule 29.01.2013
comment
давайте продолжим это обсуждение в чате   -  person Nandeep Mali    schedule 29.01.2013


Ответы (2)


Кажется, конфигурация требует, чтобы RewriteBase нужно было установить как для .htaccess.

RewriteBase /another

Это должно работать. Эта ссылка помогла в этом ответе.

Кроме того, вот несколько заметок из нашего обсуждения в чате о том, как могут повлиять другие настройки и как RewriteCond можно исправить бесконечные внутренние циклы перенаправления. Может помочь другим людям. В целом, mod_rewrite — сложный модуль.

person Nandeep Mali    schedule 29.01.2013

Попробуйте переместить псевдоним Symfony 2 внутрь VirtualHost и добавить еще один DirectoryIndex для sf2:

<VirtualHost *:80>
  # Symfony 1.4
  DocumentRoot "d:/wamp/www/wlnew/web"
  <Directory "d:/wamp/www/wlnew/web">
    DirectoryIndex index.php
    AllowOverride All
    Allow from All
  </Directory>

  Alias /sf d:/wamp/www/wlnew/lib/vendor/symfony/data/web/sf
  <Directory "d:/wamp/www/wlnew/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>

  # Symfony 2
  Alias /another "d:/wamp/www/another/web/"
  <Directory "d:/wamp/www/another/web">
    DirectoryIndex app.php
    Options Indexes FollowSymlinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>
person j0k    schedule 22.01.2013
comment
Все еще та же проблема ... спасибо за ответ, хотя ... кажется, что ни у кого Symfony1.4 и Symfony2 не работают вместе ... У меня есть приложение, написанное на 1.4, которое иммигрирует на 2 - все остальное сосуществует, кроме этого !! ! - person Manse; 23.01.2013
comment
Что ж, это странно, я тестировал (с пустым каталогом, а не с экземпляром каждой симфонии), и поведение было правильным. - person j0k; 23.01.2013
comment
Я удалю свой httpd.conf и проверю, но при использовании вышеприведенного запроса на localhost/another по-прежнему отвечает контроллер symfony1.4. - person Manse; 23.01.2013
comment
Нет - все то же самое - index.php все еще отвечает на запросы при запросе localhost/another или localhost/another/ - как будто .htaccess в /another/web игнорируется - person Manse; 23.01.2013