PHP实现Github头像缓存
在开发博客Github登录
功能,缓存Github头像
的时候,发现下载头像是个很费劲的事情。
利用位于HK的PHP虚拟主机,可以轻松解决这个问题。
伪静态依赖Apache的Rewrite模块。
PHP代码
// 屏蔽所有报错,避免图片加载失败
error_reporting(0);
// 设置需要返回的头名称
$proxied_headers = array('Set-Cookie', 'Content-Type', 'Cookie', 'Location');
// 获取URL路径
$proxy_request_url = $_SERVER['REQUEST_URI'];
// 设置请求地址HOST
$github_res_host = 'githubusercontent.com';
// 设置当前PHP文件所在相对路径,根目录设置为"/"
$proxy_base_url = '/avatar';
// 如果包含 /index.php 路径
if (strpos($proxy_request_url, $proxy_base_url . '/index.php') === 0) {
// 兼容非伪静态模式
$proxy_request_url = ltrim(substr($proxy_request_url, strlen($proxy_base_url . '/index.php')), '/');
} else {
// 依赖Apache的Rewrite模块
$proxy_request_url = ltrim(substr($proxy_request_url, strlen($proxy_base_url)), '/');
}
// 判断请求地址是否符合$github_res_host规定,防止滥用
if (strpos(substr($proxy_request_url, 0, strpos($proxy_request_url, '/')), $github_res_host) === false) {
die("403");
}
// 最终请求的远程地址
$proxy_request_url = "https://" . $proxy_request_url;
// 初始化 CURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $proxy_request_url);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
// 设置请求的 Cookie,此处用不到
// if (isset($_SERVER['HTTP_COOKIE'])) {
// $client_headers[] = "Cookie: " . $_SERVER['HTTP_COOKIE'];
// }
// 设置请求的 User-Agent
if (isset($_SERVER['HTTP_USER_AGENT'])) {
$client_headers[] = "User-Agent: " . $_SERVER['HTTP_USER_AGENT'];
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $client_headers);
$res = curl_exec($ch);
curl_close($ch);
// 解析请求到的结果
list($headers, $body) = explode("\r\n\r\n", $res, 2);
$headers = explode("\r\n", $headers);
$hs = array();
foreach ($headers as $header) {
if (false !== strpos($header, ':')) {
list($h, $v) = explode(':', $header);
$hs[$h][] = $v;
} else {
$header1 = $header;
}
}
// 设置返回头
list($proto, $code, $text) = explode(' ', $header1);
header($_SERVER['SERVER_PROTOCOL'] . ' ' . $code . ' ' . $text);
foreach ($proxied_headers as $header_name) {
if (isset($hs[$header_name])) {
foreach ($hs[$header_name] as $v) {
if ($header_name !== 'Set-Cookie') {
header($header_name . ": " . $v, false);
} else {
header($header_name . ": " . $v);
}
}
}
}
die($body);
伪静态配置
Apache伪静态配置文件.htaccess
RewriteEngine on
RewriteBase /avatar
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ index.php?/$1 [L]
开启伪静态前:https://域名/avatar/index.php/avatars2.githubusercontent.com/u/6657330?v=4
开启伪静态后:https://域名/avatar/avatars2.githubusercontent.com/u/6657330?v=4
。
测试地址:https://apio.xyz/avatar/avatars2.githubusercontent.com/u/6657330?v=4
JavaScript使用示例
const avatorDownloadURL = 'https://apio.xyz/avatar/' + avatarURL.replace('https://', '')
如此,GitHub OAuth 第三方登录
缓存头像时便可快速下载。
为什么不直接使用URL参数?
通过拼接路径并直接返回图片Header头(Content-Type
是对应图片的格式)的方式,方便直接在前端<img>
标签中引用图片,浏览器兼容性更好。实际使用时建议同步下载图片后上传到对象存储。
除特别注明外,本站所有文章均为原创。原创文章均已备案且受著作权保护,未经作者书面授权,请勿转载。
打赏
交流区(6)
666
2020年7月23日 06:50回复
😄
2020年7月23日 06:51回复
有意思
2020年7月23日 09:45回复
可以🉑
2020年7月23日 09:49回复
666
2020年7月23日 09:53回复
赶紧给你博客也加上登录!!😂
2020年7月23日 09:54回复
感谢回复! Clang 在生成时沿用了 GCC 的版本号标识,我是不是可以理解为Clang 18.1.4生成时使用的就是GCC4.8,所以我后续使用gcc 9.4
gcov
就会有不兼容的问题抱歉,这块我也不太清楚,尝试寻求AI的帮助吧。
我在这个过程中遇到了各种问题- -,现在在UDC core: g_serial: couldn't find an available UDC卡住了,请问大佬有什么解决方案吗,还是说我前置的设置就错了呢,> 这个需求很特殊。是可以的,但是比较困难,需要修改驱动配置。
好思路呀!!
关于hex编辑器,网上没找到特别好用的(小白没办法),最后在vscode上扩展一搜hex,第一个安装一下就可以用vscode进行hex编译了