Базовый URL-адрес Mojolicious при запуске приложения Mojolicious Lite на Apache в подкаталоге

Я пытаюсь запустить крошечное приложение Mojolicious Lite на Apache (общий хостинг) в подкаталоге: http://www.example.com/mymojoapp/. В основном я старался следовать этому руководству.

mymojoapp — это фактический каталог на сервере, а структура приложения выглядит следующим образом:

mymojoapp
|- .htaccess
|- app.pl
|- public
|  +- images
|  |  +- ... (image files) ...
|  +- css
|  |  +- ... (css files) ...
|  +- js
|     +- ... (js files) ...
+- templates
   |- layouts
   |  |- index-layout.html.ep
   |  +- other-page-layout.html.ep
   |- index.html.ep
   +- other-page.html.ep

.htaccess содержание:

AddHandler cgi-script .pl
Options +ExecCGI

IndexIgnore *

RewriteEngine on

RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} -f
RewriteRule ^(.*)$ public/$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ app.pl/$1 [L]

app.pl содержимое (perlml это perl + пути к установленным пользователем модулям, включая Mojolicious):

#!/usr/bin/perlml

use Mojolicious::Lite;

hook before_dispatch => sub {
    my $c = shift;
    $c->req->url->base(Mojo::URL->new(q{http://www.example.com/mymojoapp/}));
};

get '/' => 'index';

get '/u/:username' => sub {
    my $self = shift;
    $self->stash(profile => $self->stash('username'));
} => 'user-profile-page';

app->secrets(['app','secrets']);
app->start;

И в index-layout.html.ep, и в other-page-layout.html.ep я называю css (и изображения) <link rel="stylesheet" href="<%= url_for %>/css/styles.css">. Когда я получаю доступ к базовому URL-адресу (http://www.example.com/mymojoapp/), страница отображается с правильным стилем, потому что url_for дает мне /mymojoapp/ путь к таблице стилей = /mymojoapp/css/normalize.css. Но когда я получаю доступ к http://www.example.com/mymojoapp/u/someuser, путь CSS равен /mymojoapp/u/someuser/css/normalize.css, и стили не применяются.

Я чувствую, что мне не хватает каких-то правил перезаписи, или это, вероятно, можно исправить в хуке before_dispatch, но пока я не мог понять это.

Как я могу убедиться, что все страницы, созданные в моем приложении, получают правильный базовый URL-адрес?


person flamey    schedule 23.07.2017    source источник
comment
Вы должны опубликовать ответ самостоятельно и назвать источник. Не редактируйте ответ в свой вопрос. Это не форум.   -  person simbabque    schedule 24.07.2017


Ответы (1)


Получил ответ на #mojo в IRC от @jabberwok:

Вместо <%= url_for %>/css/styles.css мне нужно было использовать <%= url_for('/css/styles.css') %>.

person flamey    schedule 23.07.2017