Маршрутизация Symfony4 внутри подпапки

У меня есть приложение 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>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 557
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема в том, что ваш корень документа веб-сервера (каталог, который 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 /app /var/www/html/app, я попробую псевдоним, это кажется самым простым способом. он сейчас находится на «сервере разработки», поэтому не очень важен, и поэтому у меня есть другие приложения в /var/www/html. Большое спасибо, я попробую все ваше предложение, как только у меня будет время.

Etshy 23.12.2018 15:00

Я попытался добавить Alias в свою конфигурацию, и теперь я могу получить доступ к домашней странице моего приложения через example.com/app. Но все остальные маршруты вызывают ошибку сервера (внутренняя ошибка apache, не имеющая отношения к Symfony). Я обновил свой пост, чтобы добавить свой текущий app.conf

Etshy 24.12.2018 00:36

Внутренняя ошибка возникла из-за внутреннего перенаправления. Я поменял свой RewriteRule на этот: RewriteRule ^(?!public/index.php)$ public/index.php$1 [L]. но теперь у меня ошибка 404. Почему Apache такой сложный.

Etshy 24.12.2018 02:25
Ответ принят как подходящий

Мне удалось решить проблему !!!

Я не уверен, что конфигурация "правильная", но, похоже, она работает.

Вот мой рабочий файл 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]).

Если у кого-то есть идеи по улучшению этой конфигурации, не стесняйтесь оставлять комментарии.

Другие вопросы по теме