Coldfusion 隐藏不带控制器方法的FW/1操作(仅查看)

Coldfusion 隐藏不带控制器方法的FW/1操作(仅查看),coldfusion,controller,fw1,Coldfusion,Controller,Fw1,目前我在我的FW/1视图中使用“partials”概念:这些布局块可以被不同的视图重用。它们以下划线作为前缀以便于维护,但与CFWheels不同,它们仍然可以用作隐式视图,这不是很好 例如,有一个目录结构: /views/member/_user.cfm /views/member/profile.cfm /views/member/register.cfm 这样,实际用户表单位于_user.cfm中,可以使用#视图('member/_user')#包含到其他两个表单中 我想要的是阻止访问网站

目前我在我的FW/1视图中使用“partials”概念:这些布局块可以被不同的视图重用。它们以下划线作为前缀以便于维护,但与CFWheels不同,它们仍然可以用作隐式视图,这不是很好

例如,有一个目录结构:

/views/member/_user.cfm
/views/member/profile.cfm
/views/member/register.cfm
这样,实际用户表单位于_user.cfm中,可以使用
#视图('member/_user')#
包含到其他两个表单中

我想要的是阻止访问网站上的
member.\u user
等页面

一种解决方案是在
member.cfc
控制器中创建
\u user
方法,并将用户重定向到某个地方。但是为每个部分创建这样的方法有点低效

替代方法是在之前解析
中的
rc.action
,并检查前缀中是否有下划线,但我不确定这是干净的解决方案

如果控制器中没有相应的方法,是否可以禁用该操作(抛出404)?或者可能有一些框架事件/标志允许我在
之前的中处理“缺少方法”的情况


谢谢。

您可以在控制器中创建一个方法,用于检查rc.action,查看项目部分是否以a开头并重定向到其他位置(或抛出错误,或执行任何您想执行的操作)。然后在Application.cfc中的setupRequest()方法中使用controller()函数调用此方法

例如,我有一个控制器/security.cfc控制器,其checkItem()方法如下:

function checkItem( rc ) {
    //check if restricted item hss been requested and redirect to main.default
    if ( left(variables.fw.getItem(), 1) eq "_" ) {
        variables.fw.redirect('main');
    }
}
并在Application.cfc中的setupRequest()中调用它:

function setupRequest() {
    //controller( 'security.authorize' );
    controller( 'security.checkItem' );
}

这样,它会在每次请求时自动调用-无需为控制器中的每个_项定义单独的方法。

您可以在控制器中创建一个方法,检查rc.action以查看项部分是否以_开头并重定向到其他位置(或抛出错误,或执行任何您想执行的操作)。然后在Application.cfc中的setupRequest()方法中使用controller()函数调用此方法

例如,我有一个控制器/security.cfc控制器,其checkItem()方法如下:

function checkItem( rc ) {
    //check if restricted item hss been requested and redirect to main.default
    if ( left(variables.fw.getItem(), 1) eq "_" ) {
        variables.fw.redirect('main');
    }
}
并在Application.cfc中的setupRequest()中调用它:

function setupRequest() {
    //controller( 'security.authorize' );
    controller( 'security.checkItem' );
}
这样,它会在每次请求时自动调用-无需为控制器中的每个_项定义单独的方法。

您可以使用它来检测包含
/\uu
的URL,并根据需要进行阻止/重定向

例如:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/\w+/_
RewriteRule ^.* /error/404 [L]

第一次重写会确保该文件不存在-因此,如果您有一个真正的文件
/css/\u default.css
,任何对该文件的请求都会失败,并且不会重定向

第二个RewriteCond接受第一个段的任何字母数字,然后如果第二个段的开头有
\uuu
,则继续。(不必匹配整个URI,只需开始即可。)

最后,只有当两个条件都为真,但匹配所有URL时,才应用重写规则,并执行服务器端重定向到
/error/404
——您可以根据需要更新该部分。(
[L]
标志告诉mod_rewrite不要尝试任何进一步的重写。)

您可以使用它来检测包含
/\uucode>的URL,并根据需要进行阻止/重定向

例如:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/\w+/_
RewriteRule ^.* /error/404 [L]

第一次重写会确保该文件不存在-因此,如果您有一个真正的文件
/css/\u default.css
,任何对该文件的请求都会失败,并且不会重定向

第二个RewriteCond接受第一个段的任何字母数字,然后如果第二个段的开头有
\uuu
,则继续。(不必匹配整个URI,只需开始即可。)


最后,只有当两个条件都为真,但匹配所有URL时,才应用重写规则,并执行服务器端重定向到
/error/404
——您可以根据需要更新该部分。(
[L]
标志告诉mod_rewrite不要尝试任何进一步的重写。)

最简单的方法是将它们放在不在web根目录中的文件夹中。因此,它们不能通过网络访问。然后使用ColdFusion映射使它们可用于ColdFusion


有道理吗

最简单的方法是将它们放在不在web根目录中的文件夹中。因此,它们不能通过网络访问。然后使用ColdFusion映射使它们可用于ColdFusion


有道理吗

好的,因为没有我所期望的答案(这很好),这里有一个我已经在使用的电子邮件模板的方法

/views/emails/
中,所有视图都是电子邮件模板,没有操作,但仅按如下方式调用:

local.body = variables.fw.view("emails/registration_confirmation", local.attrs);
local.template = variables.fw.view("emails/default", {body = local.body});
component extends="components.helpers.controller" {

    public void function before(required struct rc) {
        variables.fw.redirect("user.forbidden");
    }

}
其中,
registration\u confirmation.cfm
是特定电子邮件正文的模板,
default.cfm
(可以用不同的名称)是电子邮件模板本身

为了防止我在问题控制器
电子邮件中描述的问题。cfc
如下所示:

local.body = variables.fw.view("emails/registration_confirmation", local.attrs);
local.template = variables.fw.view("emails/default", {body = local.body});
component extends="components.helpers.controller" {

    public void function before(required struct rc) {
        variables.fw.redirect("user.forbidden");
    }

}
我想可以再创建一个这样的控制器
partials.cfc
,并将所有视图保存在
/views/partials/

但这是我第一个真实的FW/1项目,我的想法太晚了,无法重构这么多视图(1),而且我认为从维护的角度来看,在同一个目录中使用分区比在对它们有意义的地方使用它们更糟糕(2)


这是我问这个问题的两个原因。

好的,因为没有我期望的答案(这很好),这里还有一个方法,我已经在使用电子邮件模板了

/views/emails/
中,所有视图都是电子邮件模板,没有操作,但仅按如下方式调用:

local.body = variables.fw.view("emails/registration_confirmation", local.attrs);
local.template = variables.fw.view("emails/default", {body = local.body});
component extends="components.helpers.controller" {

    public void function before(required struct rc) {
        variables.fw.redirect("user.forbidden");
    }

}
其中,
registration\u confirmation.cfm
是特定电子邮件正文的模板,
default.cfm
(可以用不同的名称)是电子邮件模板本身

为了防止这个问题,我