首页 文章 精选 留言 我的

精选列表

搜索[AI辅助升级],共10000篇文章
优秀的个人博客,低调大师

Gitea 升级到 1.27.3 后的 CSP 问题

被这个问题折腾得够呛,本来是希望在 Gitea 中使用 GTM,但发现怎么都配置不上,并且会导致 Gitea 前端的完全失效。 ![2026-09-15_13-11-52](https://developer.qcloudimg.com/http-save/yehe-4532411/ba9644da0db0edb94641eb8f8006bf8a.jpg) 从截图看,问题已经比较明确:**Gitea 本身的 JavaScript 并没有坏,主要是你加入的 GTM / Google Tag 代码违反了 Gitea 当前的 Content Security Policy (CSP)**,导致浏览器阻止 inline script 执行。 截图里最关键的是: ``` Executing inline script violates the following Content Security Policy directive 'script-src ...' Either the 'unsafe-inline' keyword, a hash (...) or a nonce (...) is required The action has been blocked. ``` 上面的配置会导致: ``` error: Gitea JavaScript code couldn't run correctly, please check your custom templates ``` 这个错误,虽然是这个错误,但实际上不是模板的问题。 ![2026-09-15_13-33-32|690x343](https://developer.qcloudimg.com/http-save/yehe-4532411/e9890f89c01b43215e262fe7abfd664a.jpg) 调试后,发现 CF 的预加载 Tag 管理的时候,因为 CSP 的问题导致 Gitea 的前端全部失效。 **这是 CSP(Content Security Policy)阻止了 Google Tag Manager 加载后的 inline script 执行**,不是 GTM Container ID 本身的问题。 ## 直接使用 GTM 的问题 ![2026-09-15_15-20-01|690x397](https://developer.qcloudimg.com/http-save/yehe-4532411/dcbe237467a5937aeb66b6b80a4a0803.jpg) 从截图看,错误已经很明确了:**不是缓存问题,而是 CSP Nonce 不匹配导致 GTM 的 inline script 被浏览器拦截。** 你页面里 Gitea 自己的脚本带了 nonce: ``` ``` 但你后面加入的 GTM: ``` ``` **没有 `nonce`**。 而浏览器收到的 CSP 大致是: ``` script-src 'nonce-c92794dc25088d64ef3706325643a422' ... ``` ## header.tmpl `header.tmpl` 不能把 nonce 写死。关键是要取得 **Gitea 当前请求生成的 nonce**。 所以针对你现在的 **Gitea 1.27.3**,我更建议不要继续和动态 nonce 对抗,而是把 GTM JavaScript 改成**外部 JS 文件**,这样 `header.tmpl` 本身不再包含 inline JavaScript。 ``` ``` Gitea 官方支持通过 custom 目录提供自己的静态资源。 然后创建: ``` mkdir -p /var/lib/docker/volumes/gitea_gitea-data/_data/gitea/public/assets/js nano /var/lib/docker/volumes/gitea_gitea-data/_data/gitea/public/assets/js/gtm-custom.js ``` 哪怕是这样,还是会出现 CSP 错误。 ![2026-09-15_15-36-17|690x413](https://developer.qcloudimg.com/http-save/yehe-4532411/1f47328fc5bad41190a739b1763b4326.jpg) 原因在于 GTM 的引用方式。 如果你要把 **Matomo** 用在当前 Gitea 上,建议和刚才 GTM 一样:**不要把 Matomo 的初始化代码直接写成 inline ``**,否则还是会遇到 Gitea 的 CSP nonce 问题。 你当前 GTM 遇到的麻烦是 GTM 自己会进一步执行/生成各种 Tag,因此 CSP 会比较复杂。 Matomo 如果只是使用你上面这种标准 tracker: ``` src.sharkdat.com │ ├── /assets/js/matomo-custom.js │ └── analytics.isharkfly.com/matomo.js │ └── matomo.php ``` 修改后的部署版本为: ``` var _paq = window._paq = window._paq || []; _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u = 'https://analytics.isharkfly.com/'; _paq.push(['setTrackerUrl', u + 'matomo.php']); _paq.push(['setSiteId', '1']); var d = document; var g = d.createElement('script'); var s = d.getElementsByTagName('script')[0]; g.async = true; g.src = u + 'matomo.js'; // Copy Gitea's current CSP nonce to Matomo var n = d.querySelector('[nonce]'); if (n) { g.setAttribute( 'nonce', n.nonce || n.getAttribute('nonce') ); } s.parentNode.insertBefore(g, s); })(); ``` Gitea 官方知道 Cloudflare 的页面/资源优化和改写功能可能破坏 Gitea; 但暂时没有证据表明 Gitea 官方已经把你现在这个 Cloudflare + GTM/Gitea JS initialization 问题作为同一个已知 Bug 明确记录。 这下面的问题主要是因为 CloudFlare 的脚本预加载, Gitea 的 CSP 安全机制会识别到错误干扰前端加载。

优秀的个人博客,低调大师

Google Translate 全面升级,集成 Gemini 提升翻译质量

谷歌宣布对Google Translate进行重大更新,引入Gemini技术,显著提升对习语、方言及俚语等复杂表达的翻译准确性。 该功能现已在美国和印度上线,支持英语与近20种语言(包括中文、西班牙语、印地语、日语和德语)互译,可通过Google搜索及iOS/Android版Translate应用使用。 同时,谷歌推出“实时语音翻译”Beta功能,在Android端支持70余种语言,保留说话者原有语调与节奏,初期覆盖美国、墨西哥和印度,2026年将扩展至更多国家及iOS平台。此外,语言学习工具新增发音反馈与连续学习打卡功能,并扩展至德国、印度、瑞典、台湾等近20个新地区。

优秀的个人博客,低调大师

🎉 国产开源 Servlet 容器再次引来重磅升级

1、smart-servlet 简介 smart-servlet 是目前 Gitee、Github 平台上首款,也是唯一的全栈核心技术自研的国产开源的 Servlet 容器项目。 产品特色 国产血统:核心技术 100% 全栈自研。 性能优越:搭载最新版通信微内核 smart-socket。 安全可靠:严格遵循协议规范;支持加密传输方式。 极致轻量:发行包不足800KB。 简洁易用:支持 War 包、springboot、maven-plugin 等多种运行模式,使用体验 100% 兼容 Tomcat。 版本比较 功能 开源版 企业版 目标用户 个人 企业 Servlet基础能力 ✅ ✅ Websocket规范 ❌ ✅ 异步规范 ❌ ✅ JSP ❌ ❌ 2、 版本更新 本次 smart-servlet 正式带来了一项重磅级的新特性:AsyncContext 规范的实现。 这项规范是自 Servlet 3.0 开始引入的,旨在解决传统 Servlet 模型中对于高耗时请求占据线程资源导致服务器整体吞吐能力受损问题。通过该特性,将高耗时的处理逻辑迁移至独立的线程池等待执行完毕。及时将 HTTP 线程释放出来用于处理后续请求,以此提升服务的并发能力。 本次对于该规范的实现,主要依托于 smart-http 自身提供的响应式服务能力。虽然过程中对于 Servlet 规范的解读上遇到一些磕绊,总体还是比较顺利的。 更新内容 实现FilterRegistration#setAsyncSupported规范。 实现ServletRegistration#setAsyncSupported规范。 实现ServletRequest#startAsync规范。 实现ServletContext#getContext规范。 优化HttpServletResponse#sendError规范实现。 优化HttpServletResponse#sendRedirect规范实现。 优化HttpServletResponse#getCharacterEncoding规范实现。 优化HttpServletResponse#setLocale规范实现。 优化ServletOutputStream实现规范。 SandBox移除MemoryPoolProvider。 SandBox新增VendorProvider。 SandBox新增AsyncContextProvider。 3、快速上手 我们提供了三种方式启用 smart-servlet,您可根据实际情况选择其中适用的一种。 方式一:maven 插件 这是一种类似:tomcat-maven-plugin的使用方式,通常应用于 Java Web 工程的本地开发环境。集成该插件只需在 pom.xml 中加入以下代码,便可以在 IDE 中启动 servlet 服务。 <build> <plugins> <plugin> <groupId>org.smartboot.servlet</groupId> <artifactId>smart-servlet-maven-plugin</artifactId> <version>{最新版}</version> <configuration> <port>8080</port> <path>/portal</path> </configuration> </plugin> </plugins> </build> 插件的版本建议采用最新版本,另外主要的配置项包括: port:servlet 服务启动的监听端口 path:Servlet 容器上下文路径,即 ContextPath,通常以 / 表示。当然也支持自定义,但必须以 / 开头 完成配置后在控制台输入:mvn package smart-servlet:run即可。 方式二:smart-servlet-spring-boot-starter 用过 springboot 的spring-boot-starter-tomcat或者spring-boot-starter-undertow的朋友应该对此不陌生。 smart-servlet-spring-boot-starter本质上就是 smart-servlet 对 spring-boot-starter-web 的另一种适配。 只需按照以下方式调整 springboot 工程中 pom.xml 文件的配置,便可将 springboot 的默认 Servlet 容器替换成 smart-servlet。 <dependencys> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- Exclude the Tomcat dependency --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- Use smart-servlet instead --> <dependency> <groupId>org.smartboot.servlet</groupId> <artifactId>smart-servlet-spring-boot-starter</artifactId> <version>{最新版}</version> </dependency> </dependencys> 方式三:发行包 发行包适用于 War 包的部署方式,也是生产环境中常用的一种形式。(PS:联系作者获取最新版)

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册