Javascript 将任何CDN配置为仅传递一个文件,而不管请求了什么url

Javascript 将任何CDN配置为仅传递一个文件,而不管请求了什么url,javascript,html,seo,amazon-web-services,cdn,Javascript,Html,Seo,Amazon Web Services,Cdn,我目前正在做一个新项目,在这个项目中,整个页面都应该用HTML5/JS实现,并使用API/JSON。因为整个应用程序应该只包含一个HTML文件(index.HTML)和一个JS MVC应用程序(可能是backboneJs),所以我考虑的是SEO和用户友好的URL 在那里我遇到了 window.document.pushstate('','title','/url'); 借助html5的功能,我可以定义URL,而无需真正离开或重新加载页面。但是出于性能和低成本的考虑,我希望将应用程序部署到一个新

我目前正在做一个新项目,在这个项目中,整个页面都应该用HTML5/JS实现,并使用API/JSON。因为整个应用程序应该只包含一个HTML文件(index.HTML)和一个JS MVC应用程序(可能是backboneJs),所以我考虑的是SEO和用户友好的URL

在那里我遇到了

window.document.pushstate('','title','/url');
借助html5的功能,我可以定义URL,而无需真正离开或重新加载页面。但是出于性能和低成本的考虑,我希望将应用程序部署到一个新的应用程序中。我不需要任何服务器基础设施(当然除了API所需的基础设施)

因此,我可以配置一个CDN(实际上是任何像AWS、Azure、Akamai这样的CDN)来提供相同的HTML文件,而不管URL是什么

=>交付index.html

=>交付index.html

等等


您可以在中找到一个工作示例。但是该页面的创建者可以使用.htaccess文件或熟悉的东西将所有内容映射到同一个文件。我希望在CDN中提供相同的功能

将404页面符号链接到索引页面。这样,当在您的web内容上找不到请求的URL(关于任何链接,如您的案例中所示)时,404页面将被服务,这反过来就是索引页面本身


#ln-s index.html 404.html

Nginx http服务器可以像这样执行此操作:

location /{
    # serve a file
}
或者,您可以自定义您的链接,如

location /my_html{
     # serve html file
}

location /cdn/{
     # serve rest files
}
您甚至可以通过regexp检查URL

location ~ /cdn/.*\.js${
    # serve cdn
}

CDN旨在通过从距离客户端最近的地理位置提供静态资源来交付静态内容。CDN技术并不打算对请求进行重定向或服务器端处理。你需要一些其他的东西来完成这个部分。问题在于这是服务器端技术还是某种负载平衡器/防火墙请求重写(以避免使用服务器端技术)

我不认为有一种真正的平台不可知论的方法可以做到这一点。您将始终绑定到服务器端技术或负载平衡器/防火墙平台。但听起来您可能已经有了这个约束,因为您需要在某个地方托管JSON API?即使您还没有决定使用哪个平台,几乎任何平台都应该允许您执行一些基本的路由。如果您可以为JSON Http请求提供服务,那么您也应该能够执行一些页面路由

顺便说一句,我不相信你想从你的域中所有可能的URL返回你的“index.html”。您需要一些有效URL和无效URL的列表。在这种情况下,无论如何都需要ping后端以验证请求URL。这进一步向我表明,服务器端技术比在较低级别上盲目的“一网打尽”重定向更适合此任务


我个人的偏好是使用您最喜欢的MVC框架来提供具有所需URL结构的可索引内容(几乎所有页面加载),然后在页面加载后使用JSON api来处理该内容(您希望能够完成的任何动态操作)。整个过程,包括页面加载和API,都是从同一服务器平台/环境提供的。

任何CDN都应该能够定义源服务器。如果边缘位置没有该文件,CDN将联系该服务器以提供该文件

好消息是,源服务器可以是服务于web页面的任何东西,如Apache、Nginx等。这意味着您可以应用任何类型的重写规则

如果您不想自己设置源服务器,可以查看。最近,他们引入了一种新的方法,可以帮助您在不同的“别名”下提供相同的文件。如果失败,您可以查看,但我不确定是否仍会发送错误状态代码。

我们最近联系过(这是一个类似cloudfront的cdn),通过他们的支持,他们告诉我这确实是他们可以做的,但不是通过他们的标准接口。当我们需要到单个文件的通配符路由时,我被告知只需与他们联系

至于你的问题:是的,这是可能的。只要通过他们的实时聊天联系他们,他们就会帮助你,祝你好运

更多(负面)信息:
像这样的“一网打尽”规则意味着一些浏览器(读IE)所做的愚蠢的favicon.ico-forced-request将被捕获,常规html页面将再次下载。事实上,所有针对根域的自动请求(例如,iframe也请求favicon)都将被捕获,并下载常规html文件。这可能对你来说是个问题,也可能不是,但对我来说,所有这些隐藏的请求都让我重新思考解决方案,并使用背后的Web服务器来完成实际的“一网打尽”。真可惜。

如果您有自己的域指向CDN(我知道CloudFront允许您这么做),您可以使用CloudFlare()作为用户和CDN之间的反向代理


感谢他们的免费计划,您可以创建一个规则,将所有内容重定向到index.html。我认为这是实现您想要的目标的唯一方法,因为您知道CDN被配置为只提供静态的现有文件。

如果您正在考虑SEO和友好的URL,您可以使用
pushState
完成其中的一些任务,当然。请记住:

  • 当将所有路由重定向到index.html时,您也将向搜索引擎提供完全相同的html内容,无论它们在哪个URL上前进。那么你的URL有多“SEO友好”就无关紧要了

  • 如果您认为IE支持,那么它不支持历史API,因此您需要一个更高级别的历史框架或IE的其他解决方法。这很可能包括基于
    #
    的URL。因此,对于每个视图,基本上都有两个不同的URL,当人们共享URL或查找搜索机器人CA时,这是一个需要考虑的问题。
    <!doctype html>
    <html lang="en">
    <head>
        <title>something</title>
        <!-- Load the script "js/main.js" as our entry point -->
        <script data-main="js/main" src="http://mycdn.com/js/libs/require/require.js"></script>
    </head>
    <body>
    
    </body>
    </html>