2011-12-08 2 views
15

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

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

ответ

22

Это правило перезаписи не предназначено для удаления 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 
+0

Нет необходимости «удалять» приложение .php. Вы правы в том, чтобы сделать DocumentRoot в директорию 'web', как это написано в документах symfony, но переход к любому маршруту будет автоматически маршрутизироваться через app.php. Так, например, если вы перейдете на' www. acme.com/блог/статьи/1' переписанная по умолчанию .htaccess переадресовывается на 'www.acme.com/app.php/blog/article/1', но нет необходимости напрямую перемещаться по пути с помощью app.php. Извините, если я пропустил ваш почтовый ящик, но вам может понадобиться некоторое разъяснение: по умолчанию пользователю не нужно перемещаться по app.php. – Kasheen

+3

Вы правы - 'app.php' будет использоваться в любом случае из-за правила перезаписи в файле' .htaccess'. То, что делает моя директива RedirectMatch, заключается не в том, чтобы позволить пользователям перейти в 'app.php' ** явно **. Если пользователь каким-то образом доберется до 'www.acme.com/app.php/home', она будет перенаправлена ​​на' www.acme.com/home' - вот и все. –

+0

Ага, это имеет смысл, спасибо за разъяснение! – Kasheen

0

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

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

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

0

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

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

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

+0

Почему в downvote? Это рабочее решение, которое решает проблему OP - пожалуйста, объясните, спасибо. – MicE

+0

К сожалению, я не могу установить корень документа из VirtualHost, чтобы указать прямо на веб-подпапку из-за моих ограничений, поэтому этот метод не будет работать для моего случая. :( – celestialorb

+0

@celestialorb: Да, я предположил, что это будет так - вот почему я представил второй вариант выше. В нашем случае нам нужно было разместить сайт под управлением S2 в подкаталоге существующего сайта, поэтому первый вариант был недоступен для нас. И переписывание URL-адреса через .htaccess вызвало несколько проблем с автоопределением пути в S2 (поскольку мы были на 2 уровня от корня документа). Второй вариант из вышеприведенного ответа разрешил его, и он будет работать для вашего случая – MicE

0

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

  1. Сначала я переехал приложение.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 и изображения, как они до сих пор лежат внутри/интернет/каталог поэтому все запросы на CSS и изображения будут перенаправляться к веб-страницам/css и веб-каталогам изображений соответственно.

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

+4

Извините за то, что он груб, но это смешно. веб-папка существует по какой-то причине. Вы никогда не должны оставлять файл PHP видимым для публики. Направьте виртуальный хост на веб-папку и настройте условия перезаписи, чтобы удалить app.php, или используйте index.php, которые включают app.php. Таким образом, вы НЕ коснитесь предоставленного кода рамки .... и не публикуйте свой код, чтобы его потенциально читали публично. # Представьте, что у вас это было доступно. Приложение AddType/x-httpd-php-source php – renoirb

+0

@neeraj: Я выполнил второй вариант, как вы предлагали, но я получаю пустую страницу, когда я ударил свой URL http: // localhost/symfony/i также не хочу используйте VirtualHost ... Пожалуйста, предложите. – neeraj

4

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

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

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

Для этого:

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

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

+0

У меня есть сайт, запущенный на 'example.com', размещенный в проекте NameCheap и Symfony2 на' app.example.com', размещенном на AWS. Я пробовал все, и ** это решило проблему ** мгновенно. –

+0

Это должен быть ответ – LargeTuna

5

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