Как обслуживать одну и ту же HTML-страницу для онлайн-и оффлайн-приложений?
У меня есть приложение, которое мне также нужно сделать доступным в автономном режиме. У меня нет проблем с созданием динамического контента на клиенте с помощью Javascript/Jquery против выполнения его на сервере, но я застрял с базовым макетом страницы.
Прямо сейчас мои страницы server-only
структурированы следующим образом (я использую Coldfusion
):
<cfsavecontent variable="renderedResults">
<!--- Doctype --->
<cfinclude template="../templates/tmp_pagetop.cfm">
<cfoutput><head></cfoutput>
<cfif NOT isAjaxRequest()>
<!--- page header with all meta/js/css/icons... --->
<cfinclude template="../templates/tmp_pageheader.cfm">
</cfif>
<cfoutput>
<title>#variables.title# | #tx_select_title#</title>
</head>
<body>
// page
</body>
</html>
</cfoutput>
</cfsavecontent>
<!--- COMPRESS --->
<cfscript>
compressedHTML = reReplace(renderedResults, ">s+<", "> <", "ALL");
compressedHTML = reReplace(compressedHTML, "s{2,}", chr(13), "ALL");
compressedHTML = reReplace(compressedHTML, "s{2,}", chr(09), "ALL");
variables.alredayBinary = "false";
</cfscript>
<!--- GZIP --->
<!--- SET HEADER --->
<!--- SEND BACK --->
Я использую Jquery Mobile
, который загружает первую страницу с полным head
, а затем никогда не использует заголовок снова, запрашивая последующие страницы через Ajax. Поэтому я проверяю, есть ли страница запрашивается через Ajax, и если это так, я пропускаю отправку 8K заголовка клиенту на последующих запросах страницы, потому что они не используются JQM.
Кроме того, мой шаблон заголовка содержит много условного содержимого, например:
<cfif structKeyExists(cgi, "HTTP_USER_AGENT" ) AND findNoCase("facebook", cgi.http_user_agent) NEQ 0>
<cfoutput>
<meta property="og:title" content="#variables.title#"/>
<meta property="og:type" content="website"/>
<meta property="og:url" content="#variables.base#" />
<meta property="og:site_name" content="#variables.user_firma#"/>
<meta property="og:description" content="#variables.user_fbds#"/>
<meta property="fb:admins" content="#variables.user_fbadmin#" >
</cfoutput>
</cfif>
Поэтому Facebook Open Graph meta включается только тогда, когда Facebook запрашивает страницу. Таким образом, страница по запросу Google проходит проверку W3C.
Вызов теперь... как сделать это статичным и доступным в автономном режиме.
У меня есть я думал об этом некоторое время и не нашел хорошего решения. Если Я
- обслуживайте всю страницу = Я проваливаю проверку W3C и онлайн-пользователи получают 8K штраф (да, это gzipped, но все же) на каждой странице запроса
- обслуживать страницу без заголовка = не совсем вариант
- служат две версии страницы (одна для онлайн, одна для оффлайн использование) = автономная страница будет кэширована, и пользователь будет "застрял" с этой версией из кэша, даже если он есть онлайн.
- только сделайте первую страницу с полным заголовком = пользователи, начинающие на страницах, отличных от первой, будут на сломанной странице (без заголовка). Главная страница также не проходит проверку.
Спасибо за информацию!