Sandstorm项目中的路径路由机制详解
前言
在Sandstorm平台中,每个应用实例(称为"grain")都有其独特的访问路径和路由机制。本文将深入解析Sandstorm如何管理grain的URL路径,以及开发者如何利用这些特性来优化用户体验。
基础URL结构
当用户访问Sandstorm平台上的grain时,会看到类似这样的URL: https://sandstorm.example.com/grain/TPeYUde5rioE5keWM
这个URL由Sandstorm自动生成,其中:
/grain
是固定前缀TPeYUde5rioE5keWM
是该grain的唯一标识符
Sandstorm使用这个URL将请求路由到特定的grain实例。
临时子域名机制
实际上,当用户访问grain时,Sandstorm shell会:
- 检查用户是否有访问权限
- 创建一个IFRAME来显示grain内容
- 使用随机生成的临时子域名加载内容
例如:
- 用户看到的URL:
https://sandstorm.example.com/grain/TPeYUde5rioE5keWM
- 实际IFRAME URL:
https://ui-96cab9109791f1254002ac1f857ecee7.sandstorm.example.com/
这种设计提供了额外的安全隔离层,因为每个会话都有独立的子域名。
路径和锚点处理
Sandstorm支持在grain URL中添加路径和锚点(hash),例如: https://sandstorm.example.com/grain/TPeYUde5rioE5keWM/awesomeinfo#section3
这个路径和锚点会被传递到实际的IFRAME URL中: https://ui-96cab9109791f1254002ac1f857ecee7.sandstorm.example.com/awesomeinfo#section3
动态更新URL和标题
由于grain运行在IFRAME中,默认情况下浏览器地址栏的URL和标题不会随着应用内导航而改变。开发者可以通过以下方式解决这个问题:
更新URL路径
window.parent.postMessage({'setPath': location.pathname + location.hash}, '*');
这段代码会将当前路径和锚点同步到浏览器地址栏。
更新页面标题
window.parent.postMessage({'setTitle': document.title}, '*');
对于使用Meteor等客户端路由框架的应用,建议在路由变化时自动触发这些更新。
获取和使用grain标题
应用可以获取Sandstorm中设置的grain标题:
var getGrainTitleRpcId = 0;
window.addEventListener('message', function(event) {
if(event.source !== window.parent) return;
if(event.data.rpcId === getGrainTitleRpcId) {
console.log("Grain标题:", event.data.grainTitle);
}
})
window.parent.postMessage({
getGrainTitle: {},
rpcId: getGrainTitleRpcId,
subscribe: true, // 订阅标题更新
}, '*')
分享功能集成
应用可以触发Sandstorm的原生分享功能:
// 基本分享
window.parent.postMessage({'startSharing': {}}, '*');
// 带路径的分享
window.parent.postMessage({
startSharing: {
pathname: 'download/123',
hash: 'linux',
}
}, '*');
还可以显示当前grain的访问者列表:
window.parent.postMessage({'showConnectionGraph': {}}, '*');
处理临时域名的技术方案
由于每个会话使用不同的临时子域名,应用需要特别注意资源引用和重定向问题。
推荐方案:使用空字符串作为基础URL
最简单的解决方案是在应用中始终使用空字符串''
作为基础URL,这样所有相对路径都会自动基于当前域。
运行时检测基础URL
如果必须使用绝对路径,可以通过HTTP头获取当前基础URL:
X-Sandstorm-Base-Path: http://7575abdec6caa44bb83df0e00d7d8605.me.sandcats.io:6080
特点:
- 不包含结尾斜杠
- 包含协议头(http/https)
- 每次请求都可能变化
- API请求中不包含此头
其他可用HTTP头
Sandstorm还提供:
Host
头:包含当前临时域名和端口X-Forwarded-Proto
:指示请求协议(http/https)
缓存注意事项
由于静态资源(CSS、JS、图片等)使用临时域名,浏览器无法有效缓存这些资源。这可能导致:
- 应用加载时间增加
- 移动数据使用量增加
未来Sandstorm可能会提供共享资源空间来解决这个问题。
总结
Sandstorm的路径路由机制提供了安全隔离和灵活的控制能力。开发者可以通过postMessage API与Sandstorm shell交互,实现URL同步、标题更新和分享功能。理解这些机制对于构建优秀的Sandstorm应用至关重要。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考