У меня есть приложение Symfony в моем /var/www/html/app/, и я хотел бы получить к нему доступ через host/app/, но я не могу заставить его работать.
I have a conf file with this
<Directory /var/www/html/app>
AllowOverride All
Order Allow,Deny
Allow from All
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
</Directory>
Он прокомментирован, потому что я пытался выполнить перенаправление здесь, но это не сработало, поэтому я сделал следующий .htaccess.
А этот htaccess в /var/www/html/app/.htaccess
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
С этим .htaccess, когда я перехожу к ://host/app, я перехожу к приложению symfony (а не к структуре каталогов apache), и это кажется хорошим началом.
Но проблема в том, что я получаю исключение No Routes found for /app/.
Это нормально, потому что /app/ - это подпапка на моем сервере, а не начало маршрутов symfony.
Как я могу сделать маршруты symfony начинающимися после пути к папке /app/?
Я знаю, что есть несколько вопросов о маршрутизации symfony2 / 3 в подпапках, но ответ требует разделения файлов src и public, это не то, что я хотел бы иметь.
Я просто хочу, чтобы мои маршруты работали при доступе к ://host/app.
Для информации: он отлично работает, когда я получаю доступ к ://host/app/public/*Symfony routes*.
Редактировать:
Новый app.conf
Псевдоним / rapp "/ var / www / html / app / public"
<Directory /var/www/html/app>
AllowOverride None
Order Allow,Deny
Allow from All
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
#RewriteBase /app
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?!public/index.php)$ public/index.php$1 [L]
</IfModule>
</Directory>





Проблема в том, что ваш корень документа веб-сервера (каталог, который apache сделает общедоступным через URL-адрес) и ваш корень документа проекта (общедоступный каталог) не совпадают. Вместо этого ваш сервер указывает на каталог проекта. Вот почему вам нужно вручную войти в корень документа проекта, добавив public/ к URL-адресу.
Вам следует избегать доступа к каталогу проекта, поскольку это может раскрыть вашу конфигурацию и, таким образом, сделать ваш веб-сайт уязвимым, например предоставляя людям доступ к вашей базе данных через учетные данные внутри config.
Возможно, вы сможете достичь своей цели, сохранив проект в другом месте, а затем только символически связав публичный каталог вашего проекта с /var/www/html/app. Это, вероятно, потребует некоторых изменений в вашей конфигурации apache, например добавление Options FollowSymLinks.
Другой, более сложный подход может заключаться в использовании mod_proxy. Примерно конфигурация будет выглядеть так:
# Your public server reachable from the outside
<VirtualHost *:80>
ProxyPass /app http://127.0.0.1:8080/
</VirtualHost>
# Your internal server where the requests are proxied to
<VirtualHost 127.0.0.1:8080>
<Directory /var/www/html/app/public>
AllowOverride All
Order Allow,Deny
Allow from All
</Directory>
...
</VirtualHost>
Как видите, внутренний веб-сервер указывает на корень документа вашего проекта (общедоступный каталог). Возможно, вам придется сделать дополнительные как в настройке apache, так и в приложении, например убедитесь, что доверенные прокси настроены правильно, или добавьте ProxyPreserveHost On в настройку apache, но примерно это должно указать вам правильное направление.
редактировать: Я пропустил еще одно очевидное решение, используя mod_alias, чтобы указать ваше приложение symfony на /app:
Alias /app /var/www/html/app/public
Я попытался добавить Alias в свою конфигурацию, и теперь я могу получить доступ к домашней странице моего приложения через example.com/app. Но все остальные маршруты вызывают ошибку сервера (внутренняя ошибка apache, не имеющая отношения к Symfony). Я обновил свой пост, чтобы добавить свой текущий app.conf
Внутренняя ошибка возникла из-за внутреннего перенаправления. Я поменял свой RewriteRule на этот: RewriteRule ^(?!public/index.php)$ public/index.php$1 [L]. но теперь у меня ошибка 404. Почему Apache такой сложный.
Мне удалось решить проблему !!!
Я не уверен, что конфигурация "правильная", но, похоже, она работает.
Вот мой рабочий файл app.conf (в /etc/apache2/sties-enabled/app.conf)
Alias /app "/var/www/html/app/public"
<Directory /var/www/html/app>
AllowOverride None
Order Allow,Deny
Allow from All
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteRule (/public) - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
</Directory>
Первый RewriteRule предназначен для предотвращения внутреннего цикла перезаписи, когда я переписываю URL-адрес, например example.com/app/page-1, на example.com/app/public/index.php/page-1.
Поскольку page-1 не является каталогом или файлом, он будет зацикливаться бесконечно.
Итак, я предполагаю, что как только у меня есть деталь /public, перезапись сработала, и мы останавливаем перезапись, ничего не делая, и завершаем перезапись с помощью флага [L].
Я не согласен, почему мне пришлось удалить часть public/ в "последнем" RewriteRule (RewriteRule ^(.*)$ index.php/$1 [L]).
Если у кого-то есть идеи по улучшению этой конфигурации, не стесняйтесь оставлять комментарии.
Я попытался добавить псевдоним, но как этот
Alias /app /var/www/html/app, я попробую псевдоним, это кажется самым простым способом. он сейчас находится на «сервере разработки», поэтому не очень важен, и поэтому у меня есть другие приложения в/var/www/html. Большое спасибо, я попробую все ваше предложение, как только у меня будет время.