Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 模板工具箱找不到模板文件_Apache_Perl_Mod Rewrite_Routing - Fatal编程技术网

Apache 模板工具箱找不到模板文件

Apache 模板工具箱找不到模板文件,apache,perl,mod-rewrite,routing,Apache,Perl,Mod Rewrite,Routing,我有以下.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之类的请求转发到主控制器。我还可以访问模板文件;至少在我的浏览器中,我可

我有以下.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之类的请求转发到主控制器。我还可以访问模板文件;至少在我的浏览器中,我可以打开文件:

/视图/用户/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
我可以使用Perl的open函数
打开文件,但是试图处理文件时仍然会出现错误

文件错误-标题:未找到

下面是我的代码的第二次迭代:

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

}

Template Toolkit具有配置选项
INCLUDE_PATH
,允许您设置一个或多个目录,Template Toolkit将在其中查找模板文件。如果设置include_path变量,而不是将路径放在
$tt->process()
指令中,则可以在全局配置中设置路径,而不是在每个
$tt->process()
指令中设置硬编码路径,或者必须使用
绝对
相对
选项。您可以在
INCLUDE_PATH
中指定多个目录,并使用子例程生成INCLUDE路径,因此您不限于将所有模板保留在单个目录中

因此,我将配置和流程指令更改为以下内容:

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
    INCLUDE_PATH => [ "/srv/http/perlweb/views/Users/",
                      "/wherever/header/is",
                      \&my_cool_sub_to_generate_a_path_on_the_fly ]
};

my $tt = Template->new($config);
$tt->process('add.html', $vars) or die $tt->error();
上的文档包含有关此设置选项的完整信息


请注意,您遇到的错误是关于自动包含在每个模板中的文件
标题的问题--请确保在
包含路径中有其目录。再次确认,您是否尝试在任何位置设置?您将其设置为什么?你还是犯同样的错误吗?当您使用
包含路径
时,是否同时启用了
绝对
相对
?在
预处理
配置选项中包含的
头文件在哪里?AFAICS,这就是TT所抱怨的。我删除了pre_进程选项,它工作了。我认为这可能是问题所在。Apache设置实际上并不相关——模板工具包可以处理本地文件。