Перезапись Silex + изображения в подкаталоге

Мой сайт размещен по адресу:

домен.com/dir1/dir2

Что сопоставляется внутри файловой системы (символическая ссылка) с:

/var/www/webroot/что-то/веб

В этом каталоге находится index.php моего приложения, на который должны направляться все запросы. У меня есть файл .htaccess в этом каталоге со следующим содержимым:

<IfModule mod_rewrite.c>
    Options -MultiViews

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]

</IfModule>

Это отлично работает, и функции моего приложения и все URL-адреса доступны. Проблема в том, что приложение жестко прописывает все пути к ресурсам. Например, при отображении HTML на CSS ссылаются как: <link href="/assets/css/app.css" rel="stylesheet">, хотя на самом деле файл физически находится в файловой системе по адресу /var/www/webroot/something/web/assets/css/app.css, и поэтому URL-адрес для ссылки на файл: domain.com/dir1/dir2/assets/css/app.css

Могу ли я решить это как-то с помощью .htaccess?

Я пробовал следующее:

<IfModule mod_rewrite.c>
    Options -MultiViews


    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^/assets
    RewriteRule ^ index.php [QSA,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} ^/assets
    RewriteRule ^(.*)$ /dir/dir2$1 [L]
</IfModule>

Логика этой попытки заключалась в том, что я могу позволить первому правилу обрабатывать маршрутизацию приложения. Но второе правило гарантирует, что любые попытки запросить изображения загружаются с правильного пути. К сожалению, но запрос идет к корневому каталогу домена, .htaccess недействителен. Я также не могу разместить .htaccess на домене.com.

Каковы мои варианты?


person Dean    schedule 25.04.2014    source источник
comment
Я не вижу проблемы. Ваши активы используют относительный путь, не так ли? Если URL-адрес вашего сайта — domain.com/dir1/dir2, абсолютный путь к активам будет domain.com/dir1/dir2/assets/   -  person ôkio    schedule 25.04.2014
comment
Ресурсы используют абсолютные пути в HTML. Масштабы внесения этого изменения для замены этих абсолютных путей относительными путями огромны.   -  person Dean    schedule 25.04.2014
comment
ну, <link href="/assets/css/app.css" rel="stylesheet"> не является абсолютным. Это то, что у вас есть в вашем HTML-коде на данный момент?   -  person ôkio    schedule 25.04.2014
comment
Вот что у меня есть. Но любой путь, начинающийся с /, будет отображаться в корень домена, а не в каталог активов.   -  person Dean    schedule 25.04.2014


Ответы (2)


Вы должны предварить URL-адреса своих активов базовым URL-адресом запроса.

$app['request']->getBaseUrl();

Если вы используете Twig, вы можете использовать:

app.request.baseUrl

Кстати, в документации TwigServiceProvider Silex говорится:

Вы должны добавить app.request.baseUrl перед вызовами рендеринга, чтобы убедиться, что рендеринг работает при развертывании в подкаталоге docroot.

person Guillaume Crico    schedule 01.06.2014

Попробуйте поймать путь из необработанной строки запроса

RewriteCond %{THE_REQUEST} \s(/assets/\S+)\s
RewriteRule ^ /dir/dir2%1 [L]
person Deadooshka    schedule 02.06.2014