Рассмотрим следующий URL: http://www.myurl.fr/accueil .
Это не сработает. Однако http://www.myrurl.fr/app.php/accueil действительно работает.
Я избавился от файла .htaccess, потому что хочу использовать файл vhost и полагаться на маршрутизацию Apache. Мой файл vhost следующий:
<VirtualHost my.ip.address> ServerName myurl.fr ServerAlias www.myurl.fr DocumentRoot /var/www/mysite/web DirectoryIndex app.php <Directory "/var/www/mysite/web"> AllowOverride All Allow from All </Directory> <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^app\.php(/(.*)|$) %{CONTEXT_PREFIX}/$2 [R=301,L] RewriteRule .? - [L] RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^(.*)$ app.php [QSA,L] RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$ RewriteRule ^(.*) - [E=BASE:%1] RewriteRule .? %{ENV:BASE}app.php [L] </IfModule> </VirtualHost>
Я очистил кэш Apache и перезапустил его много раз. Модификация urlrewrite включена. Я просто не знаю, что еще проверить. Любая идея, что мне не хватает?
EDIT. Возможно, что оба URL-адреса не будут работать в определенное время, так как я работаю над ним. Моя проблема все еще действительна.
Сравнивая ваши правила с Symfony-стандартным .htaccess , я видел, что вы пропустили проверку файлов, прежде чем «передать все правила». Попробуй
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ RewriteRule ^(.*) - [E=BASE:%1] RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L] # If the requested filename exists, simply serve it. # We only want to let Apache serve files and not directories. RewriteCond %{REQUEST_FILENAME} -f RewriteRule .? - [L] # Rewrite all other queries to the front controller. RewriteRule .? %{ENV:BASE}/app.php [L] </IfModule>
Документы Symfony предлагают это прямое решение этой проблемы.
'<VirtualHost *:80> ServerName domain.tld ServerAlias www.domain.tld DocumentRoot /var/www/project/web <Directory /var/www/project/web> AllowOverride None Order Allow,Deny Allow from All <IfModule mod_rewrite.c> Options -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ app.php [QSA,L] </IfModule> </Directory> # uncomment the following lines if you install assets as symlinks # or run into problems when compiling LESS/Sass/CoffeScript assets # <Directory /var/www/project> # Options FollowSymlinks # </Directory> # optionally disable the RewriteEngine for the asset directories # which will allow apache to simply reply with a 404 when files are # not found instead of passing the request into the full symfony stack <Directory /var/www/project/web/bundles> <IfModule mod_rewrite.c> RewriteEngine Off </IfModule> </Directory> ErrorLog /var/log/apache2/project_error.log CustomLog /var/log/apache2/project_access.log combined </VirtualHost>'
Одна вещь, которую я хотел бы добавить к этой дискуссии, состоит в том, что ни один из этих превосходных предложений не принесет плоды без дальнейшего рассмотрения.
Если вы работаете с Apache, вы должны обязательно включить mod_rewrite!
`sudo a2enmod rewrite`
Поэтому, если вы бьете головой о стену, задаетесь вопросом, почему ничего не работает, попробуйте это. Это может спасти ваше здравомыслие и ваш проект! Счастливое кодирование!
измените код виртуального хоста apache httpd.conf на этот
ServerName my-site.fr <VirtualHost your.ip.address:80> DocumentRoot /var/www/mysite/web <Directory "/var/www/mysite/web"> DirectoryIndex app.php Options -Indexes FollowSymLinks SymLinksifOwnerMatch AllowOverride All Allow from All </Directory> </VirtualHost>
Ключевое решение здесь – убедиться, что mod_rewrite включен, набрав
a2enmod rewrite
Если у вас есть apache 2.4 , проверьте свой конфигурационный файл, а не Order allow.deny
Require all granted
Вот пример конфигурации внутри директивы каталога
AllowOverride all Require all granted
@icarlosmendez Ваше предложение «sudo a2enmod rewrite» действительно экономит мой день!
Это то, что я сделал, надеюсь, что некоторые люди посчитают это полезным