RewriteRule в Apache с Symfony2 не удаляет app.php - PullRequest
14 голосов
/ 08 декабря 2011

У меня есть следующий файл .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 в любом случае, поэтому я ищу альтернативное решение этой проблемы. .

Ответы [ 7 ]

25 голосов
/ 03 апреля 2012

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

Для этого:

  1. Выполнить команду командной строки «a2enmod rewrite».
  2. Измените все строки «AllowOverride None» на «AllowOverride All».

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

21 голосов
/ 08 декабря 2011

Это правило перезаписи не предназначено для удаления 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
4 голосов
/ 15 октября 2013

У меня была эта проблема сегодня, и исправление было добавить / $ 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 голосов
/ 21 марта 2012

Я только что получил ту же проблему, и я исправил это так:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /web/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>
0 голосов
/ 30 января 2012

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

  1. Сначала я переместил 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 соответственно.

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

0 голосов
/ 08 декабря 2011

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

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

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

0 голосов
/ 08 декабря 2011

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

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

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

...