RewriteRule в Apache с Symfony2, не удаляя app.php

У меня есть следующий файл .htaccess в моем веб-каталоге для моей установки Symfony2:

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

Однако, когда я пытаюсь сделать что-то основное, например:

(whatever)/web/app.php/place

он не удаляет app.php из URL-адреса. Я новичок в Apache, и я не уверен, что происходит здесь, может ли кто-нибудь пролить свет? Спасибо заранее!

EDIT: Из-за структуры веб-приложения, с которым я работаю, я не могу перемещать app.php или app_dev.php за пределами веб-папки, и я не могу изменить конфигурацию сервера Apache в любом случае, поэтому я ищу альтернативное решение этой проблемы.

Ответы

Ответ 1

Это правило перезаписи не предназначено для удаления app.php из URL-адреса. Цель состоит в том, чтобы использовать app.php для каждого запроса, если URL-адрес запроса не соответствует реальному файлу. Поскольку app.php является реальным файлом, он будет использоваться для обслуживания запроса.

Если вы хотите избавиться от части web/app.php, сначала создайте виртуальный хост, указывающий на папку web:

<VirtualHost *:80>
    ServerName whatever
    DocumentRoot /path/to/project/web
</VirtualHost>

Это приведет к удалению части web.

Затем, чтобы удалить часть app.php, добавьте это в начало файла web/.htaccess:

RedirectMatch permanent ^/app\.php/(.*) /$1

Ответ 2

Вы должны включить модуль перезаписи в Apache, как указано в "IfModule mod_rewrite.c".

Для этого:

  • Запустите команду командной строки "a2enmod rewrite".
  • Измените все строки "AllowOverride None" на "AllowOverride All".

См. http://www.lavluda.com/2007/07/15/how-to-enable-mod_rewrite-in-apache22-debian/.

Ответ 3

У меня была эта проблема сегодня, и исправить было добавление /$1 в конце правила перезаписи URL.

Мой .htaccess выглядит следующим образом:

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

И виртуальный хост определяет как это:

<VirtualHost *:80>
   DocumentRoot /var/www/html/symfony_site/web
   DirectoryIndex app.php
   <Directory /var/www/html/symfony_site/web >
       AllowOverride All
       Allow from All
   </Directory>
</VirtualHost>

Ответ 4

У меня была такая же проблема, и я исправил ее так:

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

Ответ 5

Когда вы пишете RewriteCond %{REQUEST_FILENAME} !-f, вы говорите: "Не меняйте реальные файлы... они все равно должны быть доступны". Если вы удалите это, оно должно работать.

Причиной того, что это позволяет использовать некоторые структуры, позволяет использовать http://site.tld/script.php/abc=123&def=456 стиль ссылок.

Если вы хотите, чтобы он разрешал имена файлов, кроме app.php, вы могли бы добавить это как еще один RewriteCond.

Ответ 6

Мы тоже боремся с этим. Существует два решения:

  • установить корень документа вашего виртуального хоста, чтобы он указывал непосредственно на подпапку /web/ (согласно руководству Symfony2).
  • переместите app.php и app_dev.php вне подпапки /web/, затем обновите .htaccess и включите пути в оба файла соответственно (т.е. удалите web/, чтобы исправить все пути после того, как вы вручную переместили файлы один папка выше)

(Примечание. Невозможно предоставить примеры из установки ванили S2, так как symfony.com, похоже, сейчас не работает.)

Ответ 7

Мне удалось удалить часть web/app.php на моем общем сервере.

  • Сначала я переместил app.php из веб-каталога на один шаг выше, таким образом, app.php в корневом каталоге. Затем я поместил .htaccess в корневой каталог
RewriteEngine on

RewriteBase /

RewriteRule ^css/(.*) web/css/$1

RewriteRule ^images/(.*) web/images/$1

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

Я использовал RewriteCond на css и изображениях, поскольку они все еще лежат внутри/web/каталога, поэтому все запросы на css и изображения будут перенаправлены в директории web/css и web/images соответственно.

Это сработало для меня.