Symfony4 маршрутизация внутри подпапки - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть приложение 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 Alias ​​/ 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>

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

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

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

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

Я не suire, почему у меня былоудалить часть public/ в «окончательном» RewriteRule (RewriteRule ^(.*)$ index.php/$1 [L]).

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

0 голосов
/ 22 декабря 2018

Проблема в том, что корень документа вашего веб-сервера (каталог, который apache сделает общедоступным через URL) и корень документа вашего проекта (публичный каталог) не являютсятак же.Вместо этого ваш сервер указывает на каталог проекта .Вот почему вы должны вручную войти в корень документа проекта, добавив public/ к URL-адресу.

Вам следует избегать доступа к каталогу проекта, так как это может подвергнуть вашу конфигурацию и, таким образом, сделать ваш сайт уязвимым,например, предоставляя людям доступ к вашей базе данных через учетные данные внутри конфигурации.

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

Как видите, внутренний веб-сервер указывает на корень документа вашего проекта (public dir).Возможно, вам придется выполнить дополнительные действия как в настройке apache, так и в приложении, например, убедитесь, что доверенные прокси установлены правильно, или добавьте ProxyPreserveHost On в настройку apache, но примерно это должно указать вам правильное направление.

edit : я пропустил другое очевидное решение, используя mod_alias, чтобы указать приложению Symfony значение /app:

Alias /app /var/www/html/app/public
...