在 Web-App 中侦测浏览器是否启用了 JavaScript
虽然 noscript 很好用,但这不再是标准中 recommended 的标签。PPK 在其的 《PPK on JavaScript》 中曾提及使用 location.replace() 取代 noscript 的方法:
window.onload = function(){
location.replace('http://path.to/target');
}
可这般为每一个 ajax 页面创建一个侦测页面似乎有点浪费,虽然可以机器生成,但也不是一个很好的办法。由于在 Web-App 中,绝大部分的包含 JavaScript 的页面都是动态页面,我们可以使用一个专有的脚本对浏览器进行判别是否启用了 JavaScript,然后使用 location.replace() 重定向。假设我们目标页面为 /foo.php, 而在运行这个脚本以前,用于进行是否启用的 JavaScript 的脚本是 /jsdetector.php。
在 jsdetector.php 输出的页面中,我们尽可发挥创造力,做一个很漂亮、state-of-the-art 的页面,而只需要在 head 中使用 PHP 输出一句:
echo '<script type="text/javascript">location.replace("/' . $_GET['target'] . '.php");</script>';
然后,我们把所有 /foo.php 的链接替换为 /jsdetector.php?target=foo。
为了避免用户直接访问 /foo.php 这个页面、绕开浏览器的检测,在 foo.php 输出任何内容之前,进行一个小小的检测:
$referer = strtolower( basename( $_SERVER['HTTP_REFERER'], '.php' ));
if ( $referer !== 'foo' ) {
header( 'Location: /foo' );
}
这般我们就能得到一个较为简便的方法,来进行浏览器是否启用了 JavaScript 的检测。当然,我们也可以使用 Apache 的 Rewrite 功能,让这一切看起来都更为语义化、隐藏 jsdetector.php 的存在:
RewriteRule ^/fetch/foo$ /jsdetector.php?target=foo [L]
RewriteRule ^/fetch/bar$ /jsdetector.php?target=bar [L]
RewriteRule ^/fetch/baz$ /jsdetector.php?target=baz [L]
RewriteRule ^/foo$ /foo.php [L]
RewriteRule ^/bar$ /bar.php [L]
RewriteRule ^/baz$ /baz.php [L]
