我有一个使用 Apex 21.1.3 制作的公共网站。
当用户分享我网站的页面时,比如说在 Facebook 上,Facebook 会在 URL 中添加
"?fbclickId=something"
。
我的应用程序崩溃并说:
无法在应用程序中找到项目 fbclickId 的项目 ID。
Apex 认为用户正在尝试设置应用程序中不存在的元素。
我有一个使用 htaccess 的 URL 处理层,可以在将 URL 发送到反向代理中的 Apex 之前对其进行格式化。我可以说让我们忽略问号“?”之后的所有内容。但在这种情况下,我也无法设置任何应用程序项目值。所以这是不可能的。
如何让 Apex 忽略设置不存在的参数?
以谷歌为例:
此 URL
https://www.google.com/?anyparameter=anyvalue
将始终解析为 https://www.google.com
。
我不知道有什么方法可以忽略无效参数,但您可以使错误对最终用户来说更好一点。
create or replace function apex_error_custom
(
p_error IN apex_error.t_error
)
RETURN apex_error.t_error_result
IS
l_result apex_error.t_error_result := apex_error.t_error_result();
BEGIN
l_result := apex_error.init_error_result ( p_error => APEX_ERROR_CUSTOM.p_error );
IF p_error.apex_error_code = 'WWV_FLOW.FIND_ITEM_ID_ERR' THEN
l_result.message := 'Invalid url arguments';
l_result.additional_info := NULL;
END IF;
RETURN l_result;
END apex_error_custom;
这是我想出的解决方案。
我找不到任何方法来忽略不可用的字段,但找到了一个技巧来避免将它们发送到 Apex,从而避免了错误。
在中间层(nginx、apache、IIS)添加以下逻辑:
只要有两个问号,请忽略第二部分:
For example : someApexAppUrl?Parameter=value?fbclickid=something
Should become : someApexAppUrl?Parameter=value
例如每当 url 添加参数时
someApexAppUrl?Parameter=value
检查参数名称
保护级别为无限制、需要校验和 - 应用程序级别、需要校验和 - 用户级别、需要校验和 - 会话级别
的应用程序项目默认 Apex url 参数的硬编码列表,其中:session、request、clear、debug、printerFriendly、trace、timezone、lang、territory、cs、dialogCs、x01根据此文章
具有名称模式的应用程序页面项目P99_Someting
当参数不属于这三类时,请忽略它并且不要将其发送到 Apex。这样,即使 facebook 添加了类似 ?fbclickid=xxx 的内容,Apex 应用程序仍然可以很好地工作。
您可以将该项目添加到您的应用程序中以避免收到此错误消息。
创建一个名为
FBCLICKID
的应用程序项(在共享组件下)。将其会话状态保护设置为无限制。