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 соответственно.
Это сработало для меня.