Mojolicious base URL when 运行 Mojolicious Lite app on Apache under subdirectory
Mojolicious base URL when running Mojolicious Lite app on Apache under subdirectory
我正在尝试 运行 Apache(共享主机)上的一个小型 Mojolicious Lite 应用程序的子目录:http://www.example.com/mymojoapp/
。我主要尝试关注 this guide.
mymojoapp
是服务器上的实际目录,app结构如下:
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/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ app.pl/ [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?
在 IRC 的#mojo 上收到@jabberwok 的回答:
我需要使用<%= url_for('/css/styles.css') %>
而不是<%= url_for %>/css/styles.css
。
我正在尝试 运行 Apache(共享主机)上的一个小型 Mojolicious Lite 应用程序的子目录:http://www.example.com/mymojoapp/
。我主要尝试关注 this guide.
mymojoapp
是服务器上的实际目录,app结构如下:
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/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ app.pl/ [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?
在 IRC 的#mojo 上收到@jabberwok 的回答:
我需要使用<%= url_for('/css/styles.css') %>
而不是<%= url_for %>/css/styles.css
。