【问题标题】:Handle Direct Access to .html files处理对 .html 文件的直接访问
【发布时间】:2018-08-08 15:30:22
【问题描述】:

假设我正在创建一个由 AJAX 提供支持的网络应用程序。这意味着访问者只需要加载根目录(或/index.html)然后就只能通过 AJAX 访问其他页面。这是必要的,因为index.html 将是一个母版页,而其他页面只能使用ajaxifyhistory.js 加载到index.html 中的#content。当有人直接在浏览器中访问像http://example.com/blah.html 这样的页面时,就会出现问题。这将呈现一个不仅丑陋的页面,而且还会丢失index.html 上已经存在的一些重要信息。作为挑战的一部分,我不想拒绝用户访问该页面。相反,我想将访问者重定向到index.html?url=somepage.html,然后在index.html 上通过AJAX 加载somepage.html。由于脚本将页面加载到 #content 并更新了 url,因此它们最终会出现在 somepage.html 上,但现在有一个合理的页面。

以下是我可以提出的一些想法(不是解决方案)。

  • 在每个页面上包含 redirect.js 文件以检查该页面是否通过 AJAX 加载,然后有条件地将用户重定向到 index.html?url=somepage.html 但如果应用程序包含太多页面(超过一千个并且还在不断增长) ,会有太多的冗余(低效的代码)。再说一次,这甚至可行吗?也许我必须构建一些脚本来读取应用程序上的每个文件并包含所述脚本,然后再将文件的内容写回......多么棒的解决方案!
  • 使用 PHP 自动包含 .js 文件,但应用程序需要完全使用 HTML(即用户只能访问 .html 文件)并且只能通过 AJAX 使用 PHP(即 PHP 可以可用于http://example.com/ 但不适用于http://app.example.com 出于灵活性目的。使用 HTML 编写应用程序的全部意义在于能够使用诸如 Phonegap 之类的平台作为为非 Web 平台编写通用代码的一种方式,而当通过浏览器访问时,相同的代码将部署在桌面上)。有没有一种方法可以在用户访问时在每个 HTML 页面上动态包含 redirect.js 之类的文件?
  • 使用 Apache (.htaccess) 自动重定向到 index.html?url=somepage.html 但我该怎么做呢?我不知道。事实上,我需要执行此操作的确切代码。是否可以正确编码 URL 以便能够处理 somepage.html 具有自己的查询参数的情况,例如 .htaccess 中的 somepage.html?key=value&another_key=anothervalue?请注意,使用 .htaccess 是可行的,因为如果用户是本地 Phonegap 版本的应用,他们将无法直接输入 URL。

here 提出了类似的问题,但问题和给出的答案都有点模棱两可,答案实际上并没有解决这里提出的问题。

正如我在最终决定询问之前看到的那样,许多开发人员都在为类似的问题而苦苦挣扎。帮助我们。

【问题讨论】:

  • 如果 SO 强制用户给出拒绝投票的理由,那将非常有帮助。
  • 建议您阅读各种单页应用程序框架的工作原理。除此之外,正如help center 中所述,这个问题的范围太广了
  • 将所有 control 文件粘贴到一个目录中,然后拒绝访问该目录,除非它被 XMLHttpRequest 调用 - for example
  • @charlietfl 您建议我从哪个特定链接开始?我不是在创建应用程序,只是在收集知识。
  • @charlietfl “太宽泛了”,因为它为多种解决方案留下了空间,并不是说问题的目标不清楚或太宽泛而无法有一个简单的答案,对吗?我认为说这个问题“范围太广”是不公平的。问题的范围只是关于重定向丢失的用户,我认为这本身并不太宽泛。这里唯一宽泛的是如何解决问题。另请注意,您指向帮助中心的链接并没有解释为什么这个问题的范围太广。

标签: javascript php jquery ajax apache


【解决方案1】:

为起始页需要的所有站点路径添加重定向: 在 .htaccess 文件中:

RewriteEngine on
RewriteRule ^(.*)$ index.html [L]

浏览器字符串的完整路径仍然存在 喜欢:

www.site.com/index.html => 加载index.html

www.site.com/somepage.html?key=value&another_key=anothervalue => 加载index.html

index.html 需要得到这样的文件名(php):

$file_name=basename($_SERVER['SCRIPT_NAME']);  // somepage.html

以及所有获取参数

$key=$_GET['key']   //value

如果请求不是 ajax / xmlhttprequest,则在所有其他文件中都需要禁用内容 像这样:

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'){    
  exit;    
}
//content if ajax only...

【讨论】:

  • 虽然您对 PHP 的使用假定我将 PHP 文件与 HTML 一起使用,但这仍然不起作用,因为 $_SERVER['HTTP_X_REQUESTED_WITH'] 不会返回 'xmlhttprequest',尤其是当我使用 ajaxify 发出请求时.这是一个非常奇怪的行为,尽管你的答案是正确的。
  • 原则上可以拒绝Ajax检查。因为.htaccess,不允许浏览器加载除index.html以外的任何文件
  • 嗯,这意味着我的整个应用程序将仅包含 index.html 而不是任何其他页面。这当然不是一个理想的结果。
猜你喜欢
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 2019-09-15
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多