
1 RV0n 2019-09-05 08:43:02 +08:00 可以看一下 <noscript> 这个标签 |
3 Chemist 2019-09-05 08:56:33 +08:00 via iPhone 用随便一个 spa 框架写网站,不支持 js 打开自然就是一片空白。 |
4 mengkun 2019-09-05 09:05:18 +08:00 你是想防爬虫? |
5 z939211863 2019-09-05 09:06:01 +08:00 有浏览器不支持 js 么? |
6 momocraft 2019-09-05 09:08:08 +08:00 X 问题是什么 > #5 w3m 就支持 |
7 redbuck 2019-09-05 09:09:21 +08:00 进入页面用 JS 插入一个 iframe 引你得页面 |
8 redbuck 2019-09-05 09:09:39 +08:00 @z939211863 用户可以禁用 |
9 qiaobeier 2019-09-05 09:11:00 +08:00 没啥好办法,只能渲染时使用各种方法检查客户端是否禁用脚本,再存入 cookie。至于第一次,尝试使用 noscript 或者 css 去做些预处理。 |
10 lqzhgood 2019-09-05 09:18:24 +08:00 CSS 默认 display: none ~ 只显示一个 <noscript> 告诉用户没有 JS 不能显示呗。 没有上下文 不知道 LZ 需求是啥~ 我感觉是一个 A B 问题。LZ 有 A 问题觉得 B 能解,问了半天 B 结果发现 C 才是最优解。 |
11 passerbytiny 2019-09-05 09:19:12 +08:00 很明显,楼主想要的是“不给 js 权限就不让用”,你们回答“怎么在浏览器不支持 js 的时候友好显示”,跑题了。 |
12 yitd OP @passerbytiny 你是明白人 |
13 GzhiYi 2019-09-05 09:23:05 +08:00 LZ 的意思是后端判断前端有没开启 js 支持吧? |
16 asdjgfr 2019-09-05 09:29:24 +08:00 先返回一个静态页,里面用 js 获取客户端的相关信息 ua,时间戳之类的,然后调用接口,如果接口收到了就把真实的内容返回出去,否则就返回一个没权限的页面呗 |
17 jinliming2 2019-09-05 09:29:39 +08:00 via iPhone @z939211863 可以禁用。一般为了严格安全的时候都是直接禁用 js 的。tor 默认禁用不安全 js。 |
18 Chemist 2019-09-05 09:33:19 +08:00 JS 执行是在获取数据之后的事儿,除非浏览器能在请求的时候主动告诉你支不支持 JS 执行。 你这需求有点像:能不能知道刮刮卡有没有中奖,没中奖就不刮。 |
20 laravel 2019-09-05 09:35:04 +08:00 <noscript> <img src="https://www.liulangmao.org" alt=""> <iframe src="https://www.liulangmao.org" frameborder="0"></iframe> </noscript> |
21 jinliming2 2019-09-05 09:38:45 +08:00 via iPhone 逻辑很简单,如果浏览器是第一次访问这个网站,那么默认肯定是不会带是否开启 js 的信息的,所以后端就无法知道,为了避免将代码发给未开启 js 的用户,实际上就直接给个带 src 的 script 标签,不支持 js 的浏览器自然不会下载这个 js,也就避免了把代码发给浏览器。 这也是唯一的办法,因为后端无法知道是否启用了 js,所以只能一视同仁,不返回真实内容,楼主用的 cookie 也只是变通办法,相当于给开启了 js 的浏览器打“标记”。 |
22 yitd OP @jinliming2 不过好像怎么判断的时候还是需要 cookie 来通信。。 |
24 cmdOptionKana 2019-09-05 09:40:52 +08:00 可以用 js 加载内容( ajax ),如果用户禁用 js 当然无法加载内容啦,但只能对付普通用户。 但是你防普通用户干嘛?要防也是防专门爬站的,但这就是另一个话题了,反爬说起来就太多东西了。 |
25 also24 2019-09-05 09:46:37 +08:00 我隐隐的感觉这是个 X-Y 问题。 所以虽然前面已经有人问过,还是想再确认一下: 楼主你是确实业务中希望对不支持 JS 或禁用了 JS 的用户区别对待,还是想反爬虫? 单纯的区别对待,可以做的方案其实非常多,但是如果是为了反爬虫,那么很多方案并不能带来更多的复杂度。 |
26 Kusoku 2019-09-05 09:48:30 +08:00 可以用客户端重定向,不支持 js 就没法定向到实际页面 |
27 optional 2019-09-05 09:50:24 +08:00 你想在代码还没到浏览器之前就判断浏览器,这不可能。 不过实现效果很简单,由先到浏览器的代码进行后续加载即可。 |
29 Kusoku 2019-09-05 09:51:33 +08:00 www.xxx.com 返回的是包含重定向 js 代码的空白页面,能执行就定向到 www.xxx.com/xxx 的实际页面 |
30 arrow8899 2019-09-05 09:51:56 +08:00 先返回一个空白页面+一段 js (直接重定向);如果不支持 js,那么就不会重定向;支持的话 就会到正常页面。 |
31 imdong 2019-09-05 09:52:38 +08:00 判断是否支持 JS 都需要客户端判断,所以刷新一下应该无法避免了... 方案一:访问页面,传递 cookies 到客户端,noscript 标签内放一个图片,服务器如果收到这个图片的请求就标记为不支持。 方案二:页面内 head 头一秒后跳转,如果支持 js 就把跳转地址改成另一个页面。 |
32 blankfire 2019-09-05 09:55:19 +08:00 黑产?很多小黄网关掉 JS 就无法显示出广告了 |
33 icebreaker12 2019-09-05 09:55:59 +08:00 重定向+1,搞个只有最简单判断逻辑的前置页,成功后重定向到网站。 类似知乎百度跳转外链前的统计页 |
34 nihiue 2019-09-05 09:56:34 +08:00 via Android 不支持 js 的浏览器是? |
35 jugelizi 2019-09-05 09:56:36 +08:00 楼主就是单纯的想反爬 能不能好好问问题 |
36 nnnToTnnn 2019-09-05 10:02:24 +08:00 |
37 arrow8899 2019-09-05 10:06:33 +08:00 现在所有浏览器都支持 js 了吧,主动禁用 js 除外;如果是想反爬,你这么做没有任何作用。 所以楼主你最原始的需求是什么? |
38 xiangyuecn 2019-09-05 10:12:50 +08:00 在不支持 js 的地方,需要执行 js 告诉服务器这个地方不支持 js。抱歉,这是不是死循环 就是 断头路 可以在 js 里面埋暗桩(更新勤快些),同一个客户端(如何识别?)多次访问,但没有触发暗桩中的行为(如 某些请求、某些变化的数据),直接 block 此客户端(如 ip ) |
40 liuxey 2019-09-05 12:56:10 +08:00 加个登陆页,和 cloudflare 防 ddos 原理一样 https://www.a2hosting.com/images/uploads/knowledgebase_images/kb-cloudflare-under-attack-interstitial-page.png 检查完在跳正式网站 |
41 podel 2019-09-05 14:23:08 +08:00 话说 你直接弄一段 html。然后 js 自动加载的时候 移除。没有移除的 就是 不支持 js 了呗。 |
42 littiefish 2019-09-05 17:13:02 +08:00 via iPhone 装了 noscript |
43 maomaomao001 2019-09-05 17:14:30 +08:00 @kyuuseiryuu 这个想法已经落后了,写完 spa 后 , 加上 ssr, 没 js 照样能看到渲染内容 |
44 maomaomao001 2019-09-05 17:17:55 +08:00 @yitd 你这个,从原理都不通吧, 就像无论用浏览器发请求 还是你自己在 terminal 里 curl 这个地址一样 都是会返回( html )内容的, 你能做到的,只有根据 cookie,ua,用户 ip 等信息来特殊处理了 无论如何,你都不可能拿到用户禁用的 js (除非你给用户终端装病毒?) |
45 Chemist 2019-09-05 17:19:21 +08:00 @maomaomao001 #43 本来就想让不能执行 JS 的情况不可见,为什么还要去做 SSR ? |
46 Aruforce 2019-09-05 17:44:41 +08:00 所有的内容都由 JS 渲染加载啊.... 不执行 JS 肯定获取不到其他内容... 但是还是会返回一个 HTML 文本...(这个 HTML 内容就如#7 所写) |
47 killerv 2019-09-05 18:08:05 +08:00 #46 说的不错,用 js 渲染页面应该就行了。 |
48 yitd OP @imdong @passerbytiny @asdjgfr @laravel @jinliming2 @optional @maomaomao001 今天已经解决了,方法已补充 留给万一以后需求的人看 |