我正在创建一个Catalyst应用程序,目前我有一个简单的登录页面,我通过进入网址来访问。
http://mydomainname/login
这样做很完美,它获取了html页面,并使用它引用的css文件创建了一个漂亮的登录页面。
然而,如果我也去下面的网址。
http://mydomainname/login/login
我创建的登录页面仍然会被显示出来,只是这次它只是显示基本的按钮,文本框等等,而没有css,因为它似乎没有访问css文件进行样式设计。
这种情况在路径中包含'login'的情况下都会发生。
例如:
http://mydomainname/login/login
http://mydomainname/login/login/login
http://mydomainname/login/login/login/login/login
等等...
我想要的显然是 http://mydomainname/login/login
不工作或重定向到只是 http://mydomainname/login
比如说,我的Login.pm控制器
我的Login.pm控制器我有。
sub default : Private {
my ( $self, $c ) = @_;
$c->forward('login');
}
sub login : Path('/login') {
my ( $self, $c ) = @_;
$c->stash->{title} = 'Login Page';
$c->stash->{pagetype} = "html";
$c->stash->{template} = "login.html";
}
首先,控制器应该是这样的吗?我需要做什么来防止这个双url路径的问题发生呢? (例如 http://mydomainname/login/login
或 http://mydomainname/login/login/login/login
).
第一个 /login
正在从控制器名称中进行匹配,而第二个 /login
正在从Action名称(子)中匹配。
您需要将整个 login
子到你的Root控制器中,或者将其逻辑移到现有的 default
处理程序。就我个人而言,我更喜欢把登录和注销这样的操作放到Root控制器中。它们不太可能有其他的东西链到它们上面或者依赖于它们。Login.pm有其他动作或方法吗?
缺少的CSS样式很可能是login.html中相对路径的问题,或者是主程序中静态资源的配置问题。你应该可以用浏览器的开发工具来调试这个问题。
明确说不应该有参数。
sub login :Path('/login') :Args(0) {
那么控制器就不会匹配 /login/etc/etc/etc