【发布时间】:2014-12-04 12:03:46
【问题描述】:
我有以下 .htaccess 文件:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !/views/.*/.*\.html
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/(.*)$ index.pl?controller=$1&action=$2&id=$3
这允许我将 /Users/show/1 之类的请求转发到我的主控制器。我还可以访问模板文件;至少在我的浏览器中我可以打开文件:
/views/Users/add.html
但是,当我想渲染模板时尝试访问控制器中的文件时,找不到它(没有这样的文件或目录)
这是我尝试渲染模板的代码:
package UsersController;
use Moose;
use Controllers::ControllerRole;
use Template;
with 'ControllerRole';
has 'example' => (
is => 'rw',
isa => 'Str',
default =>'test',
);
sub show {
my $self = shift;
my $id = $self->{params}->{id};
my $config = {
INTERPOLATE => 1, # expand "$var" in plain text
POST_CHOMP => 1, # cleanup whitespace
PRE_PROCESS => 'header', # prefix each template
EVAL_PERL => 1, # evaluate Perl code blocks
};
my $vars = {
id => $id,
};
my $template = Template->new();
$template->process('views/Users/add.html', $vars) || die "$!";
}
1;
我也尝试过使用绝对或相对路径,但 apache 抱怨这是不允许的
查看我的项目的文件结构可能会有所帮助:
更新:
如果我使用chdir 我可以open 使用 Perl 的打开功能的文件,但尝试处理文件我仍然得到错误
file error - header: not found
这是我的代码的第二次迭代:
sub show {
my $self = shift;
chdir '/srv/http/perlweb';
my $id = $self->{params}->{id};
my $config = {
INTERPOLATE => 1, # expand "$var" in plain text
POST_CHOMP => 1, # cleanup whitespace
PRE_PROCESS => 'header', # prefix each template
EVAL_PERL => 1, # evaluate Perl code blocks
ABSOLUTE => 1,
RELATIVE => 1,
};
my $vars = {
id => $id,
planet => 'earth',
captain => 'kirk',
};
open my $fh, "views/Users/add.html" or die "$!"; #this works
close $fh;
my $tt = Template->new($config);
$tt->process('views/Users/add.html', $vars) or die $tt->error(); # this does not work
}
【问题讨论】:
-
再一次,你有没有尝试在任何地方设置
INCLUDE_PATH? -
你把它设置成什么?你仍然得到同样的错误吗?当您使用
INCLUDE_PATH时,您是否同时启用了ABSOLUTE和RELATIVE? -
您在
PRE_PROCESS配置选项中包含的header文件在哪里? AFAICS,这就是 TT 所抱怨的。 -
我删除了 pre_process 选项并且它起作用了
-
我认为这可能是问题所在。 Apache 设置并不真正相关——模板工具包适用于本地文件。
标签: apache perl mod-rewrite routing