【发布时间】:2016-06-12 20:52:33
【问题描述】:
我有一个 Rails 应用程序,它使用了两个想要在 JavaScript 中进行通信的子域。有效设置document.domain = mydomain.com 的最干燥方式是什么?
使其不那么直截了当的条件
- 这在域为
localhost的开发或测试环境中应该不是问题。 - 这也需要在某些不加载主 JavaScript 文件的页面上设置
条件1 让我认为我要么想依赖一个从location.host 解析根域的正则表达式,要么在erb 中进行切换。
条件2 让我觉得最好编写一次并将其放入资产管道并在必要时包含它。
最佳潜在解决方案
创建一个类似domain_setter.js.erb 的文件(内容如下),将其添加到预编译列表中,并将其包含在所有必要的位置(\\= require domain_setter 在清单中或javascript_include_tag 'domain_setter' 用于没有清单的页面)。
<%- if Rails.env.production? %>
document.domain = 'mydomain.com';
<%- end %>
更新当前解决方案
此解决方案更具动态性,不需要对域进行硬编码。仍然不是最好的,但它正在工作...... 大部分 :-/
(function() {
var domain = /^(?:https?\:\/\/)?.*?([^.]+\.[^.]+?)(?:\:\d+)?$/.exec(location.host);
if (domain == null) {
document.domain = 'localhost';
} else {
document.domain = domain[1];
}
})();
tl;博士
使用 Rails 设置多页 document.domain 的 DRY 方法是什么?
【问题讨论】:
-
添加一些背景知识是为了允许同一域的不同子域上的两个页面能够通过 JavaScript 进行通信。即我希望
foo.mydomain.com和bar.mydomain.com进行通信,这需要他们都拥有较低的域集mydomain.com。
标签: javascript ruby-on-rails cors cross-domain