教程

为了确保接口的返回格式统一且易于维护,我整理了一些通用的响应格式和状态码规范。这些笔记不仅帮助我在开发过程中保持一致性,也便于后续的调试和维护。设置响应头每个API的响应头可以统一设置如下,以确保跨域访问和正确的内容类型:header('Access-Control-Allow-Origin:*');//允许所有来源访问header('Access-Control-Allow-Method:POST,GET');//允许的访问方法header('Content-type:application/json;charset=utf-8');//设置响应头编码为UTF-8JSON格式化为了确保JSON数据的可读性和一致性,可以使用json_encode的以下选项:$options=JSON_NUMERIC_CHECK|JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES;echojson_encode($response,$options);JSON_NUMERIC_CHECK:将所有数字字符串转换为数字。JSON_PRETTY_PRINT:格式化JSON,便于阅读。JSON_UNESCAPED_UNICODE:不对中文字符进行转义。JSON_UNESCAPED_SLASHES:不对斜杠进行转义。常见HTTP状态码在处理HTTP请求时,以下是一些常见的状态码及其说明:200:请求成功,表示服务器成功处理了请求。400:请求错误,比如参数错误或请求格式不正确。401:未授权,通常指用户未提供有效的身份验证信息。403:禁止访问,用户没有权限访问该资源。404:资源未找到,表示请求的API端点不存在。BaseResponse响应格式为了使API响应格式保持一致,可以使用一个通用的BaseResponse函数:functionBaseResponse($code,$message,$data=[]){$response=['code'=>$code,'message'=>$message,'data'=>$data];//设置响应头header('Access-Control-Allow-Origin:*');header('Access-Control-Allow-Method:POST,GET');header('Content-type:application/json;charset=utf-8');//输出JSONechojson_encode($response,JSON_NUMERIC_CHECK|JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);exit();}接口文档规范编写接口文档时,可以按照以下结构进行描述:接口标题:简要描述接口的功能。接口描述:详细说明接口的作用。请求方法:例如POST或GET。请求URL:接口的访问地址。请求参数:参数名类型是否必填说明返回参数:参数名类型说明示例:用户登录API接口标题:用户登录接口描述:用于用户登录并获取Token。请求方法:POST请求URL:/api/v1/login请求参数:参数名类型必填说明usernamestring是用户名passwordstring是密码返回参数:参数名类型说明codeint状态码messagestring响应消息dataobject返回的数据tokenstring用户身份Token请求示例:{"username":"user123","password":"password123"}返回示例:{"code":200,"message":"登录成功","data":{"token":"abcdefg123456"}}最后这些笔记是我在API开发过程中总结出的经验,希望能对其他开发者有所帮助。通过统一的响应格式和规范的接口文档,可以有效提升API的可维护性和一致性。这些内容虽然是个人观点,但我相信在实际开发中也会带来不少便利。如果你有不同的见解或改进建议,欢迎分享!转自https://www.ahfi.cn/770.html

教程

Xrea空间去掉广告的方法1、Xrea空间去掉广告的方法完全可以按照我之前在使用Incapsula时去掉广告的方法,如果你在其它的免费空间也遇到广告的困扰,参考这篇文章即可解决:免费CDN服务Incapsula利用CSS、JS、PHP代码去掉广告方法2、部落这里用的是PHP判断用户+CSS隐藏广告的方法,原理就是用PHP判断是不是中文用户,如果是,就是用CSS隐藏广告,如果不是,则继续显示广告。这样做的好处就是避免了被免费空间人工审核时发现去广告而删除账号。3、将以下代码加入你的Xrea空间安装的Wordpress的Footer.php文件当中,就可以用CSS去掉广告了。<?php$language=substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);if($language=='zh'){echo'';}?>4、去掉Xrea空间的另一种方法是利用.htaccess,这个方法是部落收到热心朋友用QQ留言和邮箱邮件告知我的,非常地感谢。建个文件名”.htaccess”的文件,文件内容如下,将.htaccess上传至Xrea空间的Public_html目录下,即可去掉广告!LayoutIgnoreURI.phpLayoutIgnoreURI.cgiLayoutIgnoreURI.htmLayoutIgnoreURI.html四、Xrea空间免费SSH使用方法1、对于好多人来说,Xrea空间的SSH使用方法或许才是这篇文章的重点,SSH在很多的美国免费空间中都很难见到,更何况是一些日本的免费空间了,像phpapps.jp空间、Phpapps空间、Sitemix.jp空间等都仅开通了FTP,有的甚至连FTP都禁用了。2、要想使用Xrea空间的SS—H,请先进入“主机信息登记”中。3、然后点击SS-H登录。Xrea点击登录4、这是激活开通Xrea空间的SS功能,大概几分钟后就可以使用了。5、接下来是打开你的Xshell软件,新建连接,服务器地址填写你的Xrea空间的二级域名地址。6、连接上了Xrea空间的服务器后,先要保存一下服务器的密钥。7、Xrea空间SS—H用户名和密码是你的FTP账号和密码。Xrea账号和密码8、经过部落测试,Xrea空间运行一些基本的SSH命令是可以的,包括下载、移动、复制等都可以。

2024-6-10 106 0
教程

简单介绍CloudFlareSAAS,简单来说是为了给自助建站类似的网站,而提供的用户自定义域名接入的功能。比如您做一个系统,可以给用户开通分站等功能,您希望通过api的方式将您的用户自己的域名解析到CloudFlare当中,而不是直接解析到源站。考虑到本文章是为了让大家使用自选IP,因此在思路上将不会以上述分站的逻辑来解释说明。风险说明在loc有用户反馈,公共cname可能会将搜索引擎蜘蛛线路解析到其他服务器来劫持蜘蛛。1.如果您的DNS支持,建议将搜索引擎线路,修改为您的网站源站或者其他IP地址。2.使用宝塔cf2dns插件更新CloudFlare优选IPhttps://www.baota.me/post-437.html,只会更新移动联通电信三网线路。其他说明由于CloudFlare官方IP是泛播路由,意味着同一个IP在不同地区不同运营商所链接的机房是不同的。因此公共优选并不适合非网站用途,如果需要建议使用CloudflareSpeedTest项目自行测试本地最优的IP地址。完整文章一共写了多篇,本帖子删减了一些,如果需要更加完整的教程请访问以下链接获取。https://www.baota.me/tag/cloudflare.html创作不易,转载请留链接,感谢支持。准备事项CloudFlare账户:注册不难就不说了。不过需要贝宝以及海外银行卡认证来开通CloudFlareSAAS(自定义主机名)功能。网站域名:用于建站并使用自选IP的域名,并且该域名的DNS解析服务器不能使用CloudFlare,因为严格来讲CloudFlare是支持DNS解析的CDN服务,您使用该DNS解析会造成CDN配置冲突。请注意如果你使用www或者@主机名做站,您应该理解为这是两个网站域名,如www.youname.com、youname.com。文章示例中会使用web.baota.me,域名在华为云解析。回源域名:该域名NS将被CloudFlare接管,因此无法用于自选IP等用途。如果您要接入的网站域名较多,请尽可能的选择长久使用的域名,而不是年抛域名。不然年抛域名到期后需要耗费很多时间用来迁移域名。可以使用一些免费域名如eu.org,或其他比较低价的域名如.free.hr、6位数字.xyz,需要注意不是所有二级域名都支持ns接入到CloudFlare的。可以在下面文章中查看并获取其他后缀的域名。https://www.baota.me/post-410.html本文章将使用在dash.gacjie.cn注册的baota.free.hr域名。回源域名NS接入到CloudFlare如果您的回源域名已经NS添加到CloudFlare,此步可以跳过。1.将回源域名(baota.free.hr)添加到CloudFlare,应该不难就不一步一步的写了。2.复制ns服务器信息3.1.将CF提供的ns服务器信息更新到域名那边3.2.如果你没有域名也可以直接注册网站域名的顶级域名解析到非CF的DNS域名解析系统这里就不详细说明了,更换ns服务器跟回源域名NS接入到CloudFlare差不多。回源域名创建回退源地址1.source可以是@也可以是任意的子域名前缀,但我比较建议使用子域名创建。2.111.111.111.111是你的网站源服务器,您可以改为您的源站IP地址。3.代理状态(小云朵),请务必开启,如果关闭您后续添加在自定义主机名里面的网站域名将全部回源。自定义主机名添加回退源地址source.baota.free.hr是上一步创建的回退源地址,请改为您创建的域名。自定义主机名添加网站域名1.确保回退源已经生效,然后点击右上角的添加自定义主机名。2.填写您的网站域名,这里的web.baota.me是示例域名,您可能要添加www.youname.com、youname.com或者其他的二级域名。3.复制自定义主机名的DCV委派提供的信息用来下一步的域名验证。4.到您的网站域名NS解析服务商,添加DCV委派验证记录。演示截图配置的网站为web.baota.me。主机名为_acme-challenge.web值为web.baota.me.9cf4d41f99889e0c.dcv.cloudflare.com如果配置的网站为baota.me。主机名为_acme-challenge值为baota.me.9cf4d41f99889e0c.dcv.cloudflare.com如果配置的网站为www.baota.me。主机名为_acme-challenge.www值为www.baota.me.9cf4d41f99889e0c.dcv.cloudflare.com以上只是范例,实际操作时请改为您自己的DCV委派验证记录。5.添加网站域名的解析记录指向回退源6.使用ITDOG访问一次网站域名主机名一共有两种验证方式预验证:即txt或者http验证方式,但需要等待一段时间的Cloudflare官方扫描。实时验证:即将主机名正确的cname到回退源地址。本教程使用实时验证方式。考虑到dns解析缓存,为了加快验证,因此用测速工具来完成正常解析请求。7.正常情况下,刷新一下CloudFlare自定义主机名页面,应该已经完成验证了,如果没有可能要等待一段时间,或者需要检查上述配置是否出错。8.补一张图用于解析配置检查挑选优选域名由于CNAME地址会有被污染、域名所有者不维护等情况,为了方便更新,该列表会单独一个页面展示。本文章将使用cloudflare.182682.xyz域名来做示例优选域名。1.CloudFlare公共优选Cname域名列表https://www.baota.me/post-411.html经过一段时间的观察,目前比较推荐使用以下优选域名。yx.887141.xyz2.炸了吗HTTP网站测速工具https://zhale.me/http/3.测试挑选适合您网站的优选域名4.建议说明1.挑选时不要只看小地图,应该根据平均访问速度,最大访问速度,失败节点数等综合判断。2.因为有些非官方的优选IP不支持80或者443端口。因此测试时建议对http、https链接单独测试。3.如果您的网站并发过低建议使用慢速监测。快速测试:模拟用户同时访问指定网站慢速监测:模拟用户依次访问指定网站解析优选域名通过SAAS验证后,可直接替换回退源为优选域名,但出于风险考虑我比较建议分线路解析。1.国外线路解析到回退源域名是为了避免CF增加监测系统,自动删除已添加的网站域名。2.优选域名一般都会只优选国内线路,因此国外线路大概率没有进行优选。3.默认回退源域名一般情况下,国外访问最近策略,会比自定义IP效果要好。【可选】将优选域名解析到国内线路上补充截图用于校验设置【可选】将搜索引擎线路设置为源站或者其他IP在loc有用户反馈,公共cname可能会将搜索引擎蜘蛛线路解析到其他服务器来劫持蜘蛛。因此我们可以自定义搜索引擎线路来避免这种情况的发生,需要说明不是所有DNS支持这样设置。其他教程使用宝塔cf2dns插件更新CloudFlare优选IPhttps://www.baota.me/post-437.htmlCloudFlareCDN核心功能资源缓存https://www.baota.me/post-429.html更多CloudFlare系列教程https://www.baota.me/tag/cloudflare.html转自:https://hostloc.com/thread-1279428-1-1.html

教程

//Websiteyouintendedtoretrieveforusers.//constupstream='www.google.com'constupstream='yourid.free.fr'//Custompathnamefortheupstreamwebsite.constupstream_path='/'//Websiteyouintendedtoretrieveforusersusingmobiledevices.//constupstream_mobile='www.google.com'constupstream_mobile='yourid.free.fr'//Countriesandregionswhereyouwishtosuspendyourservice.constblocked_region=[]//IPaddresseswhichyouwishtoblockfromusingyourservice.constblocked_ip_address=['0.0.0.0','127.0.0.1']//WhethertouseHTTPSprotocolforupstreamaddress.consthttps=false//Whethertodisablecache.constdisable_cache=false//Replacetexts.//constreplace_dict={//'$upstream':'$custom_domain',//'//google.com':''//}constreplace_dict={'$upstream':'$custom_domain',}letdata={}addEventListener('fetch',event=>{event.respondWith(fetchAndApply(event.request));})asyncfunctionfetchAndApply(request){constregion=request.headers.get('cf-ipcountry').toUpperCase();constip_address=request.headers.get('cf-connecting-ip');constuser_agent=request.headers.get('user-agent');letresponse=null;leturl=newURL(request.url);leturl_hostname=url.hostname;if(https==true){url.protocol='https:';}else{url.protocol='http:';}if(awaitdevice_status(user_agent)){varupstream_domain=upstream;}else{varupstream_domain=upstream_mobile;}url.host=upstream_domain;if(url.pathname=='/'){url.pathname=upstream_path;}else{url.pathname=upstream_path+url.pathname;}if(blocked_region.includes(region)){response=newResponse('Accessdenied:WorkersProxyisnotavailableinyourregionyet.',{status:403});}elseif(blocked_ip_address.includes(ip_address)){response=newResponse('Accessdenied:YourIPaddressisblockedbyWorkersProxy.',{status:403});}else{letmethod=request.method;letrequest_headers=request.headers;letnew_request_headers=newHeaders(request_headers);new_request_headers.set('Host',upstream_domain);new_request_headers.set('Referer',url.protocol+'//'+upstream_domain);if(method=='POST'){letorigin_formData=awaitrequest.text()data={method:method,headers:new_request_headers,body:origin_formData}console.log(data)}elseif(method=='GET'){data={method:method,headers:new_request_headers}}letfuckKeys=Object.fromEntries(new_request_headers)console.log(method)console.log(fuckKeys)letoriginal_response=awaitfetch(url.href,data)connection_upgrade=new_request_headers.get("Upgrade");if(connection_upgrade&&connection_upgrade.toLowerCase()=="websocket"){returnoriginal_response;}letoriginal_response_clone=original_response.clone();letoriginal_text=null;letresponse_headers=original_response.headers;letnew_response_headers=newHeaders(response_headers);letstatus=original_response.status;if(disable_cache){new_response_headers.set('Cache-Control','no-store');}new_response_headers.set('access-control-allow-origin','*');new_response_headers.set('access-control-allow-credentials',true);new_response_headers.delete('content-security-policy');new_response_headers.delete('content-security-policy-report-only');new_response_headers.delete('clear-site-data');if(new_response_headers.get("x-pjax-url")){new_response_headers.set("x-pjax-url",response_headers.get("x-pjax-url").replace("//"+upstream_domain,"//"+url_hostname));}constcontent_type=new_response_headers.get('content-type');if(content_type!=null&&content_type.includes('text/html')&&content_type.includes('UTF-8')){original_text=awaitreplace_response_text(original_response_clone,upstream_domain,url_hostname);}else{original_text=original_response_clone.body}response=newResponse(original_text,{status,headers:new_response_headers})}returnresponse;}asyncfunctionreplace_form_data(formData,upstream_domain,host_name){lettext=awaitresponse.text()vari,j;for(iinreplace_dict){j=replace_dict[i]if(i=='$upstream'){i=upstream_domain}elseif(i=='$custom_domain'){i=host_name}if(j=='$upstream'){j=upstream_domain}elseif(j=='$custom_domain'){j=host_name}letre=newRegExp(i,'g')text=text.replace(re,j);}returntext;}asyncfunctionreplace_response_text(response,upstream_domain,host_name){lettext=awaitresponse.text()vari,j;for(iinreplace_dict){j=replace_dict[i]if(i=='$upstream'){i=upstream_domain}elseif(i=='$custom_domain'){i=host_name}if(j=='$upstream'){j=upstream_domain}elseif(j=='$custom_domain'){j=host_name}letre=newRegExp(i,'g')text=text.replace(re,j);}returntext;}asyncfunctiondevice_status(user_agent_info){varagents=["Android","iPhone","SymbianOS","WindowsPhone","iPad","iPod"];varflag=true;for(varv=0;v<agents.length;v++){if(user_agent_info.indexOf(agents[v])>0){flag=false;break;}}returnflag;}

教程

获取壁纸类别url:http://wallpaper.apc.360.cn/index.php?c=WallPaperAndroid&a=getAllCategoriesurl示例:http://wallpaper.apc.360.cn/index.php?c=WallPaperAndroid&a=getAllCategoriesjson示例:{"errno":"0","errmsg":"正常","consume":"10","total":"16","data":[{"id":"36","name":"4K专区","totalcnt":"2704","create_time":"2015-12-0813:50:44","displaytype":"","tempdata":""},{"id":"6","name":"美女模特","totalcnt":"3905","create_time":"2011-10-2917:49:27","displaytype":"","tempdata":""},{"id":"30","name":"爱情美图","totalcnt":"2305","create_time":"2012-11-2310:49:25","displaytype":"","tempdata":""},{"id":"9","name":"风景大片","totalcnt":"8185","create_time":"2011-11-0216:33:34","displaytype":"","tempdata":""},{"id":"15","name":"小清新","totalcnt":"6922","create_time":"2011-12-1518:47:03","displaytype":"","tempdata":""},{"id":"26","name":"动漫卡通","totalcnt":"6818","create_time":"2012-07-2717:17:42","displaytype":"","tempdata":""},{"id":"11","name":"明星风尚","totalcnt":"4316","create_time":"2011-11-0217:38:58","displaytype":"","tempdata":""},{"id":"14","name":"萌宠动物","totalcnt":"2722","create_time":"2011-12-1518:23:27","displaytype":"","tempdata":""},{"id":"5","name":"游戏壁纸","totalcnt":"2041","create_time":"2011-10-2917:49:12","displaytype":"","tempdata":""},{"id":"12","name":"汽车天下","totalcnt":"1757","create_time":"2011-12-1318:59:40","displaytype":"","tempdata":""},{"id":"10","name":"炫酷时尚","totalcnt":"4828","create_time":"2011-11-0217:10:53","displaytype":"","tempdata":""},{"id":"22","name":"军事天地","totalcnt":"665","create_time":"2012-05-2915:10:04","displaytype":"","tempdata":""},{"id":"16","name":"劲爆体育","totalcnt":"1174","create_time":"2011-12-3011:37:49","displaytype":"","tempdata":""},{"id":"32","name":"纹理","totalcnt":"333","create_time":"2013-03-1813:58:21","displaytype":"","tempdata":""},{"id":"35","name":"文字控","totalcnt":"926","create_time":"2014-09-2518:35:57","displaytype":"","tempdata":""},{"id":"1","name":"限时壁纸","totalcnt":"204","create_time":"2014-09-2518:20:40","displaytype":"","tempdata":""}]}解析:total:返回数据数量data:返回的数据name:类别名id:totalcnt:该类别壁纸数量获取某类别下的壁纸url:http://wallpaper.apc.360.cn/index.php?c=WallPaperAndroid&a=getAppsByCategory其他拼接参数:cid:类别id,类别已知:1:每日精选5:游戏6:美女9:风景10:视觉创意11:明星影视12:汽车14:萌宠动物15:小清新16:体育22:军事26:动漫卡通30:情感35:文字start:跳过的记录数count:返回的数量url示例:http://wallpaper.apc.360.cn/index.php?c=WallPaperAndroid&a=getAppsByCategory&cid=9&start=0&count=99json示例:{"errno":"0","errmsg":"正常","consume":"6","total":"8185","data":[{"pid":"319229","cid":"9","dl_cnt":"0","c_t":"2018-05-0210:10:54","imgcut":"0","url":"http://p16.qhimg.com/t01d7effbff8a01b127.jpg","tempdata":"","fav_total":"9319"},{"pid":"319146","cid":"9","dl_cnt":"0","c_t":"2018-04-2710:06:11","imgcut":"0","url":"http://p17.qhimg.com/t018bb2253d2df00838.jpg","tempdata":"","fav_total":"6425"},{"pid":"319145","cid":"9","dl_cnt":"0","c_t":"2018-04-2710:05:44","imgcut":"0","url":"http://p19.qhimg.com/t018d05d2327c2f4bec.jpg","tempdata":"","fav_total":"7093"},{"pid":"319144","cid":"9","dl_cnt":"0","c_t":"2018-04-2710:05:01","imgcut":"0","url":"http://p19.qhimg.com/t012864214a3c106fbc.jpg","tempdata":"","fav_total":"5866"},{"pid":"319143","cid":"9","dl_cnt":"0","c_t":"2018-04-2710:04:37","imgcut":"0","url":"http://p17.qhimg.com/t01d7f7956cc1be4821.jpg","tempdata":"","fav_total":"5997"}]}解析:total:返回数据数量data:返回的数据pid:cid:类别IDurl:壁纸地址fav_total:收藏数按关键字搜索壁纸url:http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=search其他拼接参数:kw:关键字start:跳过的记录数count:返回的数量url示例:http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=search&start=0&count=99&kw=%E6%AF%95%E4%B8%9A&start=0&count=99json示例:{"errno":"0","errmsg":"success","consume":"0","total":"97","data":[{"id":"305990","class_id":"35","resolution":"1920x1200","url_mobile":"http://p18.qhimg.com/t017489cbb76a02bf66.jpg","url":"http://p18.qhimg.com/bdr/__85/t017489cbb76a02bf66.jpg","url_thumb":"http://p18.qhimg.com/t017489cbb76a02bf66.jpg","url_mid":"http://p18.qhimg.com/t017489cbb76a02bf66.jpg","download_times":"0","imgcut":"0","tag":"_全部__category_文字__category_毕业季__category_伤感__category_文字控_","create_time":"2017-06-1613:30:06","update_time":"2017-06-1613:33:07","utag":"文字毕业季伤感","tempdata":"","rdata":[],"img_1600_900":"http://p18.qhimg.com/bdm/1600_900_85/t017489cbb76a02bf66.jpg","img_1440_900":"http://p18.qhimg.com/bdm/1440_900_85/t017489cbb76a02bf66.jpg","img_1366_768":"http://p18.qhimg.com/bdm/1366_768_85/t017489cbb76a02bf66.jpg","img_1280_800":"http://p18.qhimg.com/bdm/1280_800_85/t017489cbb76a02bf66.jpg","img_1280_1024":"http://p18.qhimg.com/bdm/1280_1024_85/t017489cbb76a02bf66.jpg","img_1024_768":"http://p18.qhimg.com/bdm/1024_768_85/t017489cbb76a02bf66.jpg"},{"id":"306106","class_id":"35","resolution":"1920x1200","url_mobile":"http://p16.qhimg.com/t01b31a7859ecc52066.jpg","url":"http://p16.qhimg.com/bdr/__85/t01b31a7859ecc52066.jpg","url_thumb":"http://p16.qhimg.com/t01b31a7859ecc52066.jpg","url_mid":"http://p16.qhimg.com/t01b31a7859ecc52066.jpg","download_times":"0","imgcut":"0","tag":"_全部__category_文字__category_毕业季__category_伤感__category_文字控_","create_time":"2017-06-2013:12:50","update_time":"2017-06-2013:12:50","utag":"文字毕业季伤感","tempdata":"","rdata":[],"img_1600_900":"http://p16.qhimg.com/bdm/1600_900_85/t01b31a7859ecc52066.jpg","img_1440_900":"http://p16.qhimg.com/bdm/1440_900_85/t01b31a7859ecc52066.jpg","img_1366_768":"http://p16.qhimg.com/bdm/1366_768_85/t01b31a7859ecc52066.jpg","img_1280_800":"http://p16.qhimg.com/bdm/1280_800_85/t01b31a7859ecc52066.jpg","img_1280_1024":"http://p16.qhimg.com/bdm/1280_1024_85/t01b31a7859ecc52066.jpg","img_1024_768":"http://p16.qhimg.com/bdm/1024_768_85/t01b31a7859ecc52066.jpg"}]}解析:total:返回数据数量data:返回的数据id:壁纸idtag:所属的壁纸类别名称utag:壁纸tagsfav_total:收藏数获取今日热门搜索url:http://openbox.mobilem.360.cn/html/api/wallpaperhot.htmljson示例:{"error":0,"end_state":1,"total":11,"data":["爱情箴言","一个人","范冰冰","温馨","阿狸","恶搞","lomo","清纯","瓶邪","正能量","毕业季","葫芦娃","手写","世界杯","TFBOYS","我是歌手","李易峰","早安"]}解析:total:返回数据数量data:返回的数据

2023-11-19 109 0
教程

第一种方法(以图片源文件进行随机)第一步:新建一个文件夹,命名为:img(这个文件里放你需要的图片)第二步:新建一个index.php文件,写入以下代码(这个文件就是api地址)<?php$img_array=glob("img/*.{webp,gif,jpg,png}",GLOB_BRACE);$img=array_rand($img_array);$dz=$img_array[$img];header("Location:".$dz);?>第二种方法(以图片链接进行随机)第一步:创建一个img.txt文件(这个文件里放你的储存的图片链接,一行一条)第二步:新建一个index.php文件,写入以下代码(这个文件就是api地址)<?php//存有链接的文件名,这里是存放图片链接的txt文件$filename="img.txt";if(!file_exists($filename)){die('文件不存在');}//从文本获取链接$pics=[];$fs=fopen($filename,"r");while(!feof($fs)){$line=trim(fgets($fs));if($line!=''){array_push($pics,$line);}}//从数组随机获取链接$pic=$pics[array_rand($pics)];//返回指定格式$type=$_GET['type'];switch($type){//JSON返回case'json':header('Content-type:text/json');die(json_encode(['pic'=>$pic]));default:die(header("Location:$pic"));}随机图片API搭建教程1.本地文件夹调用。2.外链调用(推荐)。1.本地文件夹调用第一步:在网站根目录下创建一个文件夹,一个PHP文件:img,index.php。第二步:将以下内容写入index.php中。有两个地方可供修改。<?php$img_array=glob("img/*.{gif,jpg,png}",GLOB_BRACE);$img=array_rand($img_array);$dz=$img_array[$img];header("Location:".$dz);?>第三步:将喜欢的图片放入img文件夹中,访问绑定的域名即可随机展示。2.外链调用(推荐)第一步:在网站根目录下创建一个txt,一个PHP文件:img.txt,index.php。第二步:将以下内容写入index.php中。有一个地方可供修改,<?php$img=file('img.txt');$url=array_rand($img);header("Location:".$img[$url]);?>第三步:将喜欢的图片上传到图床后复制链接到img.txt中,访问绑定的域名即可随机展示。设备自适应输出第一步:在网站根目录准备好不同设备要用的txt图片链接存储文本第二步将以下内容写入index.php中,已注释可供修改<?php//判断当前设备是否为移动设备的函数functionis_mobile(){$user_agent=$_SERVER['HTTP_USER_AGENT'];//获取用户代理字符串$mobile_agents=array('Android','iPhone','WindowsPhone','BlackBerry','SymbianOS');//定义移动设备关键词数组//遍历移动设备关键词数组,检查用户代理字符串中是否包含这些关键词foreach($mobile_agentsas$mobile_agent){if(stripos($user_agent,$mobile_agent)!==false){returntrue;//如果找到关键词,返回true表示是移动设备}}returnfalse;//如果没有找到关键词,返回false表示不是移动设备}//从指定的txt文件中随机获取一条图片链接的函数functionget_random_image($filename){$image_urls=file($filename,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);//读取txt文件的每一行,存储到一个数组中if(count($image_urls)>0){$random_index=array_rand($image_urls);//从数组中随机选择一个索引return$image_urls[$random_index];//返回选中的图片链接}else{returnfalse;//如果数组为空,返回false表示没有图片链接}}//直接输出图片的函数functionoutput_image($image_url){$headers=get_headers($image_url,1);//获取图片链接的HTTP头信息if(isset($headers['Content-Type'])){header('Content-Type:'.$headers['Content-Type']);//设置响应的Content-Type头部信息}echofile_get_contents($image_url);//读取并输出图片内容}$is_mobile=is_mobile();//判断当前设备是否为移动设备$filename=$is_mobile?'mpm.txt':'moe.txt';//根据设备类型选择相应的txt文件$image_url=get_random_image($filename);//从txt文件中随机获取一条图片链接if($image_url){output_image($image_url);//输出图片}else{echo"Noimagesfoundinthetxtfile.";//如果没有图片链接,输出错误信息}?>

教程

Typecho的语法及函数,实在记不住,而且每次都要去百度一遍,着实是麻烦。还是自己保存下来吧,方便查阅!文章内容均来自网络,并整合。https://blog.chrison.cn/work/87.html模板常用函数1、站点网址<?php$this->options->title()?>2、站点网址<?php$this->options->siteUrl();?>3、完整路径标题如分享几个Type­cho中常用的调用函数<?php$this->archiveTitle('&raquo;',<spanclass="string">'','|');?><?php$this->options->title();?>4、站点说明<?php$this->options->description()?>5、模板文件夹地址<?php$this->options->themeUrl();?>6、导入模板文件夹内的php文件<?php$this->need('.php');?>7、文章或者页面的作者<?php$this->author();?>8、作者头像<?php$this->author->gravatar('40')?>此处输出的完整的img标签,40是头像的宽和高。9、该文作者全部文章列表链接<?php$this->author->permalink();?>10、该文作者个人主页链接<?php$this->author->url();?>11、该文作者的邮箱地址<?php$this->author->mail();?>12、上一篇与下一篇调用代码<?php$this->thePrev();?><?php$this->theNext();?>13、判断是否为首页,输出相关内容<?phpif($this->is('index')):?>//首页输出内容<?phpelse:?>//不是首页输出内容<?phpendif;?>14、文章或页面,评论数目<?php$this->commentsNum('NoComments','1Comment','%dComments');?>15、截取部份文章(首页每篇文章显示摘要),350是字数<?php$this->excerpt(350,'...');?>16、调用自定义字段(官方文档坑爹,竟然没有,博主自己摸索出来的)<?php$this->fields->fieldName?>17、RSS地址<?php$this->options->feedUrl();?>18、获取最新post<?php$this->widget('Widget_Contents_Post_Recent','pageSize=8&type=category')->parse('<li><ahref="{permalink}">{title}</a></li>');?>19、纯文字分类名称,不带链接<?php$this->category(',',false);?>20、获取当前文章所属分类(包含链接)<?phpif($this->is('post')):?><span><?php$this->category('');?></span><?phpendif;?>21、获取文章分类列表<ul><?php$this->widget('Widget_Metas_Category_List')->parse('<li><ahref="{permalink}">{name}</a>({count})</li>');?></ul>22、获取某分类post<ul><?php$this->widget('Widget_Archive@indexyc','pageSize=8&type=category','mid=1')->parse('<li><ahref="{permalink}"title="{title}">{title}</a></li>');?></ul>23、获取最新评论列表<ul><?php$this->widget('Widget_Comments_Recent')->to($comments);?><?phpwhile($comments->next()):?><li><ahref="<?php$comments->permalink();?>"><?php$comments->author(false);?></a>:<?php$comments->excerpt(50,'...');?></li><?phpendwhile;?></ul>24、首页获取最新文章代码限制条数<?phpwhile($this->next()):?><?phpif($this->sequence<=3):?>html<?phpendif;?><?phpendwhile;?>25、获取最新评论列表(只显示访客评论不显示作者或者说自己发的评论)<?php$this->widget('Widget_Comments_Recent','ignoreAuthor=true')->to($comments);?><?phpwhile($comments->next()):?><li><ahref="<?php$comments->permalink();?>"><?php$comments->author(false);?></a>:<?php$comments->excerpt(50,'...');?></li><?phpendwhile;?>26、获取文章时间归档<ul><?php$this->widget('Widget_Contents_Post_Date','type=month&format=FY')->parse('<li><ahref="{permalink}">{date}</a></li>');?></ul>27、获取标签集合,也就是标签云<?php$this->widget('Widget_Metas_Tag_Cloud','ignoreZeroCount=1&limit=28')->to($tags);?><?phpwhile($tags->next()):?><ahref="<?php$tags->permalink();?>"class="size-<?php$tags->split(5,10,20,30);?>"><?php$tags->name();?></a><?phpendwhile;?>28、调用该文相关文章列表<?php$this->related(5)->to($relatedPosts);?><?phpif($relatedPosts->have()):?>//这句也可以写成if(count($relatedPosts->stack))<ul><?phpwhile($relatedPosts->next()):?><li><ahref="<?php$relatedPosts->permalink();?>"title="<?php$relatedPosts->title();?>"><?php$relatedPosts->title();?></a></li><?phpendwhile;?></ul><?phpelse:?><li>无相关文章</li><?phpendif;?>29、隐藏head区域的程序版本和模版名称<?php$this->header("generator=&template=");?>30、获取读者墙<?php$period=time()-999592000;//時段:30天,單位:秒$counts=Typecho_Db::get()->fetchAll(Typecho_Db::get()->select('COUNT(author)AScnt','author','url','mail')->from('table.comments')->where('created>?',$period)->where('status=?','approved')->where('type=?','comment')->where('authorId=?','0')->group('author')->order('cnt',Typecho_Db::SORT_DESC)->limit(25));$mostactive='';$avatar_path='http://www.gravatar.com/avatar/';foreach($countsas$count){$avatar=$avatar_path.md5(strtolower($count['mail'])).'.jpg';$c_url=$count['url'];if(!$c_url)$c_url=Helper::options()->siteUrl;$mostactive.="<ahref='".$c_url."'title='".$count['author']."(参与".$count['cnt']."次互动)'target='_blank'><imgsrc='".$avatar."'alt='".$count['author']."的头像'class='avatar'width='32'height='32'/></a>\n";}echo$mostactive;?>31、登陆与未登录用户展示不同内容<?phpif($this->user->hasLogin()):?>//登陆可见<?phpelse:?>//未登录和登陆均可见<?phpendif;?>32、导航页面列表调用隐藏特定的页面这个演示隐藏了al­bum和search两个页面<ul><li<?phpif($this->is('index')):?>class="current"<?phpendif;?>><ahref="<?php$this->options->siteUrl();?>">主页</a></li><?php$this->widget('Widget_Contents_Page_List')->to($pages);?><?phpwhile($pages->next()):?><?phpif(($pages->slug!='album')&&($pages->slug!='search')):?><li<?phpif($this->is('page',$pages->slug)):?>class="current"<?phpendif;?>><ahref="<?php$pages->permalink();?>"title="<?php$pages->title();?>"><?php$pages->title();?></a></li><?phpendif;?><?phpendwhile;?></ul>参数说明:9.0版typecho支出在后台管理页面编辑时选择隐藏页面。33、Type­cho归档页面<?php$this->widget('Widget_Contents_Post_Recent','pageSize=10000')->to($archives);$year=0;$mon=0;$i=0;$j=0;$output='<divid="archives">';while($archives->next()):$year_tmp=date('Y',$archives->created);$mon_tmp=date('m',$archives->created);$y=$year;$m=$mon;if($mon!=$mon_tmp&&$mon>0)$output.='</ul></li>';if($year!=$year_tmp&&$year>0)$output.='</ul>';if($year!=$year_tmp){$year=$year_tmp;$output.='<h3class="al_year">'.$year.'年</h3><ulclass="al_mon_list">';//输出年份}if($mon!=$mon_tmp){$mon=$mon_tmp;$output.='<li><spanclass="al_mon">'.$mon.'月</span><ulclass="al_post_list">';//输出月份}$output.='<li>'.date('d日:',$archives->created).'<ahref="'.$archives->permalink.'">'.$archives->title.'</a><em>('.$archives->commentsNum.')</em></li>';//输出文章日期和标题endwhile;$output.='</ul></li></ul></div>';echo$output;?>34、获取当前文章页缩略图<?php$this->attachments(1)->attachment->url();?>务必注意,这里所谓缩略图指的是当前文章页第一个附件地址,请确保第一个附件类型为图片。35、根据页面类型显示内容判断是文章页则显示内容<?phpif($this->is('post')):?>想要显示的内容1<?phpendif;?>判断是页面则显示内容<?phpif($this->is('page','about')):?>想要显示的内容2<?phpendif;?>36、Title增加副标题<?phpif($this->is('index')):?>-副标题<?phpendif;?>37、按分类输出cms<divclass="row"><?php$this->widget('Widget_Metas_Category_List')->to($categories);?><?phpwhile($categories->next()):?><?phpif(count($categories->children)===0):?><?php$this->widget('Widget_Archive@category-'.$categories->mid,'pageSize=5&type=category','mid='.$categories->mid)->to($posts);?><divclass="col-lg-6"><divclass="panelpanel-default"><divclass="panel-heading"><iclass="glyphiconglyphicon-th"></i><ahref="<?php$categories->permalink();?>"class="guidang"id="posts-list-<?php$categories->slug();?>"><?php$categories->name();?></a><ahref="<?php$categories->permalink();?>"class="pull-right"id="posts-list-<?php$categories->slug();?>"><iclass="glyphiconglyphicon-option-horizontal"></i></a></div><divclass="panel-body"><?phpwhile($posts->next()):?><pclass="overflow"><ahref="<?php$posts->permalink();?>"title="<?php$posts->title(40);?>"><iclass="glyphiconglyphicon-chevron-right"></i><?php$posts->title(40);?></a></p><?phpendwhile;?></div></div></div><?phpelse:?><?phpendif;?><?phpendwhile;?></div>38、相关文章<?php$this->related(5)->to($relatedPosts);?><ul><?phpwhile($relatedPosts->next()):?><li><ahref="<?php$relatedPosts->permalink();?>"title="<?php$relatedPosts->title();?>"><?php$relatedPosts->title();?></a></li><?phpendwhile;?></ul>39、侧边栏热门标签<divclass="widget"><h3><?php_e('热门标签');?></h3><ulclass="cate"><?php$this->widget('Widget_Metas_Tag_Cloud',array('sort'=>'count','ignoreZeroCount'=>true,'desc'=>true,'limit'=>20))->to($tags);?><?phpwhile($tags->next()):?><li><arel="tag"href="<?php$tags->permalink();?>"><?php$tags->name();?></a></li><?phpendwhile;?><divclass="clear"></div></ul></div>40、侧边栏输出所有标签<divclass="widget"><h3><?php_e('所有标签');?></h3><ulclass="cate"><?php$this->widget('Widget_Metas_Tag_Cloud')->to($tags);?><?phpwhile($tags->next()):?><li><arel="tag"href="<?php$tags->permalink();?>"><?php$tags->name();?></a></li><?phpendwhile;?><divclass="clear"></div></ul></div>41、当前文章的标签说明:(',',true,'none')第一个单引号间的逗号代表标签与标签的间隔用逗号隔开,true是标签以超链接形式输出false则只输出文字,none为该文章没有标签时显示的提示信息可为空。<?php$this->tags(',',true,'none');?>引申用法:如果想给每个标签套上div或者span什么的就需要这要做<div><?php$this->tags('</div><div>',true,'none');?></div>判断当前标签并自定义内容<?phpif(in_array('abc',$this->tags)):?>文章含有abc标签就会显示这里<?phpendif;?>判断文章是否存在标签,如果存在输出标签,如果不存在输出该文章分类<?phpif(count($this->tags)==0):?>//此处的count也可改为size<?php$this->category(',',true,'none');?>//文章分类<?phpelse:?><?php$this->tags(',',true,'none');?>//文章标签<?phpendif;?>代码片段以下为代码片段及对应的调用方式;代码片段请放置于function.php中1、输出文章缩略图/**输出文章缩略图*/functionshowThumbnail($widget){//当文章无图片时的默认缩略图$rand=rand(1,5);//随机1-5张缩略图$random=$widget->widget('Widget_Options')->themeUrl.'/img/sj/'.$rand.'.jpg';//随机缩略图路径//$random=$widget->widget('Widget_Options')->themeUrl.'/img/mr.jpg';//若只想要一张默认缩略图请删除本行开头的"//"$attach=$widget->attachments(1)->attachment;$pattern='/\<img.*?src\=\"(.*?)\"[^>]*>/i';if(preg_match_all($pattern,$widget->content,$thumbUrl)){echo$thumbUrl[1][0];}elseif($attach->isImage){echo$attach->url;}else{echo$random;}}调用方法:<?phpshowThumbnail($this);?>2、获取文章第一张图片做缩略图functionshowThumbnail($widget){  $attach=$widget->attachments(1)->attachment;  $pattern='/\<img.*?src\=\"(.*?)\"[^>]*>/i';  if(preg_match_all($pattern,$widget->content,$thumbUrl)){    echo$thumbUrl[1][0];  elseif($attach->isImage){    echo$attach->url;  }else{    echo$random;  }}调用方法:<imgsrc="<?phpshowThumbnail($this);?>">3、评论自动排第一functionAutofirst(){$db=Typecho_Db::get();$query=$db->select()->from('table.comments')->where('authorId=?','0')->order('coid',Typecho_Db::SORT_DESC)->limit(100);$result=$db->fetchAll($query);$arrUrl=array();$arrAuthor=array();foreach($resultas$value){if($value["url"]!==null){array_push($arrUrl,$value["url"]);array_push($arrAuthor,$value["author"]);}}$su=array_filter(array_merge(array_unique($arrUrl)));$sa=array_filter(array_merge(array_unique($arrAuthor)));$num=0;for($i=0;$i<count(array_unique($su));$i++){if($su[$i]!==""&&$num<8){$num+=1;$db1=Typecho_Db::get();$query1=$db1->select()->from('table.comments')->where('url=?',$su[$i])->order('coid',Typecho_Db::SORT_DESC)->limit(100);$result1=$db1->fetchAll($query1);$arrAuthor1=array();foreach($result1as$value){array_push($arrAuthor1,$value["author"]);}echo'<divclass="col-lg-3col-md-3item"><ahref="'.$su[$i].'"rel="externalnofollow"class="btnbtn-defaultbtn-blockoverflow"target="_blank">'.$arrAuthor1[0].'</a></div>';}}}调用方法:<?phpAutofirst(100)?>4、随机文章functiongetRandomPosts($limit=10){$db=Typecho_Db::get();$result=$db->fetchAll($db->select()->from('table.contents')->where('status=?','publish')->where('type=?','post')->where('created<=unix_timestamp(now())','post')->limit($limit)->order('RAND()'));if($result){$i=1;foreach($resultas$val){if($i<=3){$var='class="red"';}else{$var='';}$val=Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);$post_title=htmlspecialchars($val['title']);$permalink=$val['permalink'];echo'<li><i'.$var.'>'.$i.'</i><ahref="'.$permalink.'"title="'.$post_title.'"target="_blank">'.$post_title.'</a></li>';$i++;}}}调用方法:<?phpgetRandomPosts('10');?>5、热门文章functiongetHotComments($limit=10){$db=Typecho_Db::get();$result=$db->fetchAll($db->select()->from('table.contents')->where('status=?','publish')->where('type=?','post')->where('created<=unix_timestamp(now())','post')//添加这一句避免未达到时间的文章提前曝光->limit($limit)->order('commentsNum',Typecho_Db::SORT_DESC));if($result){foreach($resultas$val){$val=Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);$post_title=htmlspecialchars($val['title']);$permalink=$val['permalink'];echo'<li><ahref="'.$permalink.'"title="'.$post_title.'"target="_blank">'.$post_title.'</a></li>';}}}调用方法:<?phpgetHotComments('10');?>6、文章阅读量统计functionget_post_view($archive){$cid=$archive->cid;$db=Typecho_Db::get();$prefix=$db->getPrefix();if(!array_key_exists('views',$db->fetchRow($db->select()->from('table.contents')))){$db->query('ALTERTABLE`'.$prefix.'contents`ADD`views`INT(10)DEFAULT0;');echo0;return;}$row=$db->fetchRow($db->select('views')->from('table.contents')->where('cid=?',$cid));if($archive->is('single')){$db->query($db->update('table.contents')->rows(array('views'=>(int)$row['views']+1))->where('cid=?',$cid));}echo$row['views'];}调用方法:<?phpget_post_view($this)?>

教程

从2021年11月开始,CloudFlare禁用了Partner使用的zone_setAPI以避免滥用(因为该API接入不需要验证域名所有权),通过Partner实现CNAME接入的方式近乎落幕,仅剩Plesk空间存量的ServerShieldbyCloudflare插件订阅能够正常接入。几个月过去了,官方也并没有对未来合作伙伴如何进行接入新域名给出任何解释。错过了Partner的时代,官方的CloudFlareforSaaS也提供了一种更灵活的CNAME接入方式,一起来看看吧。一、功能简介CloudFlareforSaaS不是个新功能,这里单独拿出来讲,主要是几天前CF调整了一波免费额度。过去是每个域名收取2USD/月的费用,现在不仅提供100个域名免费额度,而且超额后每个域名仅按0.1USD/月收取费用,非常良心。官方公告:https://blog.cloudflare.com/waf-for-saas/CloudFlare中一个完全接入的域名即为一个zone,点进去包括套餐、安全等等都是针对这一主域名配置的。官方SaaS功能针对的是你服务的客户,开放这项功能允许使用他们自己的域名直接附加在你的zone里,享受你zone包含的安全、加速等功能。说起来可能不是很直白,这里举几个应用场景的例子:★应用场景1:a.com通过NS接入了CF,b.com未接入CF;可以通过SaaS功能实现1.b.com/2.b.com等直接附加在a.com上,通过CNAME指向CF的节点。★应用场景2:a.com通过Plesk接入了CF,具有免费的PleskPlus版本,b.com未接入CF或使用的免费版;可以通过SaaS功能实现1.b.com/2.b.com等直接附加在a.com上,享受a.com域名下的ECC+RSA双证书、页面规则、高级防火墙权益。简而言之,可以通过这项功能,实现其他域名的CNAME接入以及对zone权益的共享,有兴趣的话,接着往下看吧~二、配置接入订阅CloudFlareforSaaS打开一个域名,选择【SSL/TLS】下的【自定义主机名】,点击【启用CloudFlareforSaaS】后根据指示绑定外币卡或者PayPal,订阅CloudFlareforSaaS功能。CloudFlareforSaaS订阅本身是针对整个计费账户的,所以通过Partner接入的域名出现【请联系客户成功经理以启用适用于SaaS的SSL】时,只需要选择个通过官方NS激活的域名启用订阅后即可使用。这里猜测可能是Partner接入的商务权限交给了合作伙伴,方便下放优惠和服务那些,我们绕过去就行了。激活页面中文翻译比较滞后,从英文的可以看到免费额度已经进行更新,可以放心使用。设置源站选择一个承载的域名zone点进去,依然是【SSL/TLS】下的【自定义主机名】,首先要设置附加上域名的源站。在这之前要在承载的域名zone中设置一个子域名作为源站的来源,比如origin.a.com,在Partner或者官方DNS设置好它的源站(注意是是在CF里添加,和正常添加网站的流程一样)。SaaS这里的源站叫回退源(FallbackOrigin),输入刚才设置的子域名并点击【AddFallbackOrigin】,它会同步这个子域名设置的源站作为后续在此接入域名的源站。有些人就会问了,这样设置那不是后续SaaS添加的所有其他域名就只能用同一个源站了?答案确实是这样,为每个SaaS域名自定义源站需要Enterprise以上套餐,有多域名需求多开几个zone吧(苦笑)。添加自定义主机名后续的工作就很简单了,点击【添加自定义主机名】,输入你要添加的未在CF接入的子域名。建议直接选择TXT验证,因为除了证书还有另一条TXT记录要添加,一起加上去比较方便。验证域名所有权添加完成后,按要求解析证书和主机名两个TXT记录,解析生效后10分钟左右即可验证通过,到此这个SaaS域名就正确的添加到了你的zone中并接入了CF。特别提醒,如图这里CF给出的验证TXT名称是应完整域名的解析记录,所以在自己的第三方DNS配置的时候,填入的主机名应当是example和_cf-custom-hostname.example,如果直接复制框内的内容把根域名b.com填进了主机名全域就变成了example.b.com.b.com了,是错误的。配置完成之后你可以通过直接复制的域名来检查TXT记录是否匹配,推荐MySSL的工具(点击前往)。经过测试,不论以何种方式验证并签发证书,只要保持SSL正确指向CloudFlare,系统就能够在到期前一个月自动为你续期证书,无需进行手动的操作。相应的,SaaS页面Certificatevalidationmethod也会变成HTTPValidation。SaaS域名解析添加进去的SaaS域名,CF并不会给你提供明确的CNAME供指向。如果是官方接入的可以直接CNAME到你刚刚设置的源站域名比如origin.a.com,通过Partner接入的直接解析到源域名对应的CNAME比如origin.a.com.cdn.cloudflare.net即可。其他的配置比如分线路解析、自选IP就可以按照自己的喜好去设置了,在此不过多赘述。此外,对于防火墙规则、页面规则,直接将添加进的域名输入其中即可圈定范围,完成对于其细则的设置。三、结语CloudFlareforSaaS是官方提供的一项非常方便的免费功能,弥补了早期未通过Partner接入只能强制NS接入的缺憾。有官方保障、灵活CNAME、免费的优点,也有源站不灵活等缺点,肯定还是不如已经通过Partner/Plesk接入的域名灵活。〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓配置CNAME接入在配置之前,您需要准备两个域名以及PayPal账号:septem.cc:此域名需要通过NS的方式接入CloudFlaresep.cc:此域名即为你需要加速的域名。一、设置回源域名在配置CNAME接入之前,需要设置回源所需的域名。在DNS选项中,设置一个自定义的接入CloudFlare的二级域名(即文中提到的septem.cc设置一个二级域名解析到你的网站IP),解析至需要回源的IP或域名,并且打开CloudFlare的代理)。注:上图红框中的8.8.8.8为你源服务器的IP,切忌一定要填写正确,并打开橙色的代理状态!!!二、开通CloudFlareforSaaS打开网站配置页面,并且找到SSL/TLS下的自定义主机名。订阅CloudFlareforSaaS需要绑定外币信用卡或PayPal,个人建议绑定PayPal(此过程不会发生扣费)由于之前已经开通过了,所以无法演示,根据提示进行操作即可。然后打开SSL/TLS下的自定义主机域,在回退源中,填写设置好的域名,并且点添加回退源,等待生效。三、此时即可增加需要CNAME接入的域名点击添加自定义主机名,输入你需要接入的域名,并且选择TLS版本以及证书验证方式即可,点击添加自定义主机名。验证域名所有权添加完成后,按要求解析证书和主机名两个TXT记录,解析生效后10分钟左右即可验证通过,到此这个SaaS域名就正确的添加到了你的zone中并接入了CF。注:如图这里CF给出的验证TXT名称是应完整域名的解析记录,所以在自己的第三方DNS配置的时候,填入的主机名应当是sep.cc和_cf-custom-hostname.sep.cc,如果直接复制框内的内容把根域名sep.cc填进了主机名全域就变成了example.sep.cc.sep.cc了,是错误的。配置完成之后你可以通过直接复制的域名来检查TXT记录是否匹配,推荐MySSL的工具(点击前往)。SaaS域名解析添加进去的SaaS域名,CF并不会给你提供明确的CNAME供指向。可利用国内DNS解析可以直接CNAME到你刚刚设置的源站域名比如:sep.ccCNAME记录指向cname.septem.cc就不再赘述如何解析了,在第三步添加域名的时候可以添加根域名以及二级域名,只要在国内DNS解析的时候验证好TXT记录即可,别忘了在源服务器上建立一个跟你添加的域名相匹配的网站!CloudFlareforSaaS是官方提供的一项非常方便的免费功能,弥补了早期未通过Partner接入只能强制NS接入的缺憾。有官方保障、灵活CNAME、免费的优点,相比第三方,数据保存在自己的手上更加安全。

教程

前言GitHub可以用来存放一些文件,在网页加载文件的时候引入你在GitHub库中所保存的文件,减少服务器的压力增加网页的加载速度,例如:音乐,视频,字体文件以及网页文件。但是GitHub在国内的加载速度特别慢,这个时候就需要JSDeliver把GitHub库中的内容分发到各个地方,以此来加快速度为什么我要介绍这个方法呢,因为现在许多的网盘外链并不是永久的,有可能开了防盗链就无法正常引用资源了,自己搭建的网盘又是动态生成链接或者页面,这导致资源无法引用注:JSDeliver不支持加载超过20M的资源,所以一些视频最好压缩到20M以下教程开始一、创建存储库访问https://github.com/你的ID?tab=repositories,并点击New按钮填写Repositoryname(容器名字),这个接下来要用到记住下面的库一定要选择公共库,因为JSDeliver用到的就是公共库,如果选择私人会导致无法正常引用cdn二、上传要缓存的文件下面的代码不用管,点击uploadinganexistingfile把你要上传的文件拖拽到方框内,或者点击chooseyourfiles上传你要存到GitHub的文件,我这里上传的是本站的ico图标上传完以后一定要记得按commitchanges点击createanewrelease,然后tag填上版本号,写1.0什么的都可以,随便填也行,我个人写的cdn,再点击publishrelease即可三、通过JSDeliver调用刚刚上传的资源示例:https://cdn.jsdelivr.net/gh/你的用户名/你的仓库名@tag名/文件路径我刚才上传的图片文件名是1631154058228.png,存储在了根目录,我的GitHub用户名是qiyunbk,仓库名是cdn,tag是cdn,所以我访问的路径是:https://cdn.jsdelivr.net/gh/qiyunbk/cdn@cdn/1631154058228.png(点击查看)在你需要引用的地方插入以上代码,一个个人的cdn就搭建好了通过此方法不止可以存储图片,一些其他的静态资源例如js,css,字体等都可以通过此方法存到GitHub然后通过JSDeliver访问的。------------------------------------------操作步骤1.注册GitHub账号。2.新建一个仓库名称自己定3.下载GitHubDesktop客户端并安装,然后登陆官方下载地址:https://desktop.github.com/蓝奏云下载地址:http://go.zeruns.tech/T4.clone刚刚的仓库到本地5.将博客静态资源下载下来这里以handsome主题为例,将主题目录/usr/themes/handsome下的assets文件夹打包并下载下来6.将刚刚下载的文件解压到仓库目录7.上传文件到仓库8.然后访问:https://cdn.jsdelivr.net/gh/用户名/仓库名@master/即可访问你的内容了!如本文示例:https://cdn.jsdelivr.net/gh/zeruns/cdn@master/9.设置主题