PHP:如何确定浏览器是否支持JavaScript?

5
我正在构建一个AJAX深度链接站点。
如果用户正在使用不支持Javascript的浏览器或搜索爬虫访问站点,我希望PHP加载页面的所有HTML代码。基本上,PHP将返回整个页面。
相反,当用户使用支持Javascript的浏览器访问站点时,我希望PHP仅返回模板代码,并让Javascript(AJAX)处理其余部分。基本上,PHP只会加载设计元素,然后让Javascript填充内容。
我研究了PHP的get_browser()函数,但似乎它并不是一个可靠的工具。业内惯例如何使用PHP判断浏览器是否支持Javascript或者是否为搜索爬虫?

背景:

为什么我希望网站有这种行为。

因为我希望主页只需加载地址:example.com,而不发送任何查询到PHP,PHP将返回主页的HTML代码。然而,当用户尝试加载以下页面时会出现问题:example.com#foo。因此,对于此示例,PHP将返回主页,一旦主页加载完成,Javascript(AJAX)将更改内容,以显示#foo的正确内容。这将使用户看到主页,因此加载时间将更慢,用户体验也不太好。但是,如果我的PHP脚本可以确定正在尝试加载页面的支持Javascript浏览器的用户,则它将仅返回网站的模板(没有内容),而javascript将使用内容填充该模板,无论应该显示什么内容。另一方面,如果Javascript非分离浏览器或爬虫尝试访问页面example.com#foo,则将返回主页。

我正在使用SWFaddress(http://www.asual.com/swfaddress/)库进行深度链接。


编辑

谢谢大家。我之前没有想到使用 <noscript></noscript>

这是我决定采取的方法。PHP默认会加载像 example.comexample.com#foo(从PHP的角度来看,这与 example.com 本质上相同,因为按定义片段不会发送到服务器)的页面为空白(只有视觉模板),其中包含 <noscript> 标签,用于主页的内容。这样,具有 JavaScript 的用户将无法看到主页,并且 AJAX 将根据 #foo 片段填充页面的内容。另一方面,搜索爬虫和没有 JavaScript 的用户将看到一个主页。

再次感谢。我认为这是一个相当简单而优雅的解决方案。如果您有任何进一步的建议,请发表评论或另一个答案。


考虑使用像Node.js这样的服务器端JavaScript - http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/ - ajreal
好主意。不幸的是,并非所有的服务器提供商都安装了它,或者至少我正在使用的那个没有安装。 - miki725
5个回答

5

使用PHP无法做到这一点。但您可以使用noscript标签,如果用户没有启用JavaScript,则重定向到另一个PHP页面:

<noscript>
<meta http-equiv="refresh" content="0; URL=nojavascript.php">
</noscript>

搜索爬虫是否支持此功能? - miki725
网络爬虫会捕捉到这个,但我不确定它们是否会进入那个URL。您可以在sitemap.xml文件中告诉它是否要访问该文件。 - wajiw

1

以你现在的尝试方式是不可能完成这个任务的。

很少有人会关闭JS并且不知道它。

PHP无法获取#后面的任何内容,只有JavaScript可以处理。所以即使PHP能够确定浏览器是否开启了JavaScript,它仍然无法读取#后面的内容。


有些人(使用屏幕阅读器或盲文阅读器的盲人、手机用户等)没有JavaScript。 - trusktr
这很罕见,但知道它很重要。 - trusktr

1

你可以在一些<NOSCRIPT>标签中包含一个链接,指向像example.com#foo?javascript=disabled这样的东西,以引导用户。

不幸的是,浏览器不会报告JS是否启用,因此无法从简单的HTTP GET中知道是否应该发送依赖于JS的页面。


0

与其让服务器试图嗅探用户的设置,不如一开始就使用不显眼的JavaScript。这样,如果JS不可用,页面将会优雅地降级(到期望的状态)。


0
你只需要建立一个 AJAX 查询,为启用 JavaScript 的会话变量进行设置。
在站点加载任何其他信息之前运行此 AJAX 查询,然后简单地重定向到实际站点。
你可以使用这样的伪代码:

Index.php:

ajax(check_js.php);
redirect(main_page.php);

check_js.php

$_SESSION['js_enable'] = true;

main_page.php

if($_SESSION['js_enable'] == true) {
  //execute page
} else {
  header("Location: no_js_error.php");
}

@James Thompson - AJAX查询如何在不知道浏览器JavaScript是否启用的情况下工作? - ajreal
这个想法是可行的,但不如其他方法高效。这样做会带来不必要的流量。 - Mark Baijens
它不会生效。如果他们禁用了JS,它将失败,因此页面会话变量表明他们可以使用JS将永远不会被设置。 - James Thompson
为什么每个人都投票反对这个答案,我不知道。这个回答是有效的,你们这些笨蛋。 - trusktr
实际上,这个答案可能比<noscript>答案更可靠,因为谁知道<noscript>在所有浏览器上是否都有效? - trusktr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接