拓冰建站拓冰建站
首页 / 资讯中心 / 正文

grocy 1.8.2 修复实录:让登录表单尊重 BASE_URL 配置与子目录部署的 URL 生成机制

grocy 1.8.2 修复实录让登录表单尊重 BASE_URL 配置与子目录部署的 URL 生成机制【免费下载链接】grocyERP beyond your fridge - Grocy is a web-based self-hosted groceries household management solution for your home项目地址: https://gitcode.com/GitHub_Trending/gr/grocy在 grocy 1.8.1 引入BASE_URL配置项以支持子目录部署之后1.8.22018-04-18迅速修复了一个直接影响用户体验的问题登录表单没有遵守配置的BASE_URL见 changelog/17_1.8.2_2018-04-18.md。本文以这一修复为切入点结合当前仓库源码完整讲解BASE_URL/BASE_PATH配置的语义、UrlManager的 URL 构造机制、登录页与登录流程中的 URL 生成链路以及如何正确配置使 grocy 运行在站点根目录或子目录下。读完本文你将能独立排查登录后跳转错误登录表单提交 404资源路径丢失等子目录部署常见问题。一、修复背景1.8.1 引入 BASE_URL1.8.2 补齐登录链路该修复并非孤立事件而是对 1.8.1 新功能的完善。1.8.1 的更新日志明确记录见 changelog/16_1.8.1_2018-04-18.md新增配置项BASE_URL用于定义安装的基础 URL目标是让子目录安装成为可能对应 issue #3补充了部分缺失的翻译。也就是说1.8.1 把告诉 grocy 它部署在哪个基础 URL 上的能力加了进来但当时登录页面的 URL 生成逻辑尚未接入这一配置。1.8.2 正是把这块漏网之鱼补上——修复登录表单未遵守已配置的BASE_URL。判断依据当前仓库中的 config-dist.php 仍保留着对BASE_URL的完整注释说明而 changelog/16_1.8.1_2018-04-18.md 与 changelog/17_1.8.2_2018-04-18.md 成对记录了这两个版本在该功能上的递进关系。二、BASE_URL 与 BASE_PATH两个极易混淆的部署配置要理解这次修复首先必须分清 grocy 提供的两个相关配置项。两者都定义在 config-dist.php 中但职责不同BASE_URL完整的基础 URL// The base URL of your installation, // should be just / when running directly under the root of a (sub)domain // or for example https://example.com/grocy when using a subdirectory Setting(BASE_URL, /);默认值/表示运行在子域名的根路径下子目录场景例如部署在https://example.com/grocy时应设置为https://example.com/grocy作用范围它被注入到UrlManager见下文用于生成页面跳转、表单 action、资源引用等全部 URL。BASE_PATHSlim 框架的 base path// When running Grocy in a subdirectory, this should be set to the relative path, otherwise empty // It needs to be set to the part (of the URL) AFTER the document root, // if URL rewriting is disabled, including index.php // Example with URL Rewriting support: // Root URL https://example.com/grocy // BASE_PATH /grocy // Example without URL Rewriting support: // Root URL https://example.com/grocy/public/index.php/ // BASE_PATH /grocy/public/index.php Setting(BASE_PATH, );默认值空字符串作用范围Slim 应用的路由匹配。在 app.php 中// Set base path if defined if (!empty(GROCY_BASE_PATH)) { $app-setBasePath(GROCY_BASE_PATH); }BASE_PATH是文档根目录之后的那段 URL 路径不包含协议与域名它决定 Slim 如何匹配路由BASE_URL则是完整的、用于对外生成链接的 URL。两者配合使用才能让子目录部署完整生效。补充说明BASE_PATH是后续版本2.6.1见 changelog/56_2.6.1_2020-03-06.md中明确要求子目录用户必须设置的新配置1.8.x 时代主要是通过BASE_URL解决链接生成问题。三、核心机制UrlManager 如何构造 URL1.8.2 修复的实质就是让登录表单的action走通UrlManager这条统一 URL 生成链路。当前仓库中的实现位于 helpers/UrlManager.phppublic function __construct(string $basePath) { if ($basePath /) { $this-BasePath $this-GetBaseUrl(); } else { $this-BasePath $basePath; } } public function ConstructUrl($relativePath, $isResource false) { if (GROCY_DISABLE_URL_REWRITING false || $isResource true) { return rtrim($this-BasePath, /) . $relativePath; } else // Is not a resource and URL rewriting is disabled { return rtrim($this-BasePath, /) . /index.php . $relativePath; } }该类的行为可以拆解为三条规则默认自动探测当BASE_URL为默认值/时GetBaseUrl()会根据HTTPS/HTTP_X_FORWARDED_PROTO请求头与HTTP_HOST自动拼出当前访问的协议与主机见 helpers/UrlManager.php例如https://grocy.example.com显式配置优先当BASE_URL配置为子目录地址如https://example.com/grocy时直接使用该值不再自动探测URL 重写开关当DISABLE_URL_REWRITING为true且目标不是静态资源时会在路径中插入index.php对应DISABLE_URL_REWRITING配置项见 config-dist.php。UrlManager在应用初始化时以单例方式注册进容器app.php并在多个地方被消费数据库迁移完成后跳转到根路由header(Location: . (new UrlManager(GROCY_BASE_URL))-ConstructUrl(/))app.php日历服务构造 iCal 订阅链接services/CalendarService.php、controllers/Api/CalendarApiController.phpOpenAPI 文档与 API Key 管理页面的链接生成controllers/Api/OpenApiController.php。四、修复点还原登录表单的 URL 生成链路从当前仓库源码可以完整还原登录页面的 URL 生成路径这正是 1.8.2 修复所覆盖的代码链路。4.1 路由注册登录相关路由在 routes.php 中注册// Login routes $group-get(/login, [LoginController::class, LoginPage])-setName(login); $group-post(/login, [LoginController::class, ProcessLogin])-setName(login); $group-get(/logout, [LoginController::class, Logout]);4.2 视图中的表单 action登录表单模板 views/login.blade.php 通过$U()辅助函数生成提交地址form methodpost action{{ $U(/login) }} idlogin-form novalidate$U()在 controllers/BaseController.php 中定义本质上是容器内UrlManager的封装$this-View-set(U, function ($relativePath, $isResource false) use ($container) { return $container-get(UrlManager)-ConstructUrl($relativePath, $isResource); });在 1.8.2 修复之前登录表单的 action 若使用硬编码或未经过UrlManager的路径在子目录部署时就会生成错误地址导致登录表单提交后 404 或跳转到错误位置修复后action{{ $U(/login) }}生成的地址会正确带上BASE_URL前缀。4.3 登录处理与跳转表单以 POST 提交到/login后由 controllers/LoginController.php 的ProcessLogin处理if ($authMiddlewareClass::ProcessLogin($postParams)) { return $response-withRedirect($this-AppContainer-get(UrlManager)-ConstructUrl(/)); } else { return $response-withRedirect($this-AppContainer-get(UrlManager)-ConstructUrl(/login?invalidtrue)); }成功登录跳转到ConstructUrl(/)即BASE_URL对应的首页失败则带invalidtrue参数回到登录页——两处跳转同样走UrlManager。登出时也使用ConstructUrl(/)完成重定向controllers/LoginController.php。值得注意的实现细节登录表单的密码字段名为password_base64views/login.blade.phpProcessLogin会在处理前将其base64_decode还原为明文密码controllers/LoginController.php避免密码以明文形式直接随表单传输。五、配置实践根目录与子目录两种部署方式综合以上机制可得到两种典型配置修改data/config.php由config-dist.php复制而来场景一运行在域名根路径默认Setting(BASE_URL, /); // 默认值自动探测协议与主机 Setting(BASE_PATH, ); // 默认值Slim 不做额外前缀匹配这是最简单的方式。UrlManager在BASE_URL /时自动根据HTTPS/HTTP_HOST构造完整基础地址。场景二运行在子目录如 https://example.com/grocySetting(BASE_URL, https://example.com/grocy); // 完整基础 URL Setting(BASE_PATH, /grocy); // 文档根之后的部分BASE_URL保证登录表单 action、跳转链接、资源引用都带/grocy前缀BASE_PATH保证 Slim 路由在/grocy前缀下仍能正确匹配。若同时禁用了 URL 重写DISABLE_URL_REWRITING trueBASE_PATH还需包含index.php参见 config-dist.php 的注释示例。配置的三种覆盖优先级无论采用哪种场景BASE_URL都可以通过三种途径设置优先级从高到低见 config-dist.php覆盖文件data/settingoverrides/BASE_URL.txt文件内容即配置值README 中描述见 README.md环境变量GROCY_BASE_URLconfig.php 中的默认值Setting(BASE_URL, ...)。验证配置是否生效修改BASE_URL或BASE_PATH后grocy 会通过版本/配置哈希自动清空视图缓存并触发必要的迁移。在 app.php 中// Empty data/viewcache when and trigger database migrations when: // The version changed (so when an update was done) // GROCY_BASE_URL OR GROCY_BASE_PATH changed $hash hash(sha256, file_get_contents(__DIR__ . /version.json) . GROCY_BASE_URL . GROCY_BASE_PATH);随后应用会重定向到ConstructUrl(/)完成初始化。你可以直接观察打开登录页后浏览器地址栏与表单action是否带上了预期前缀登录成功后跳转的首页地址是否正确页面中的静态资源CSS/JS即$U(path, true)的资源分支是否可加载。六、小结grocy 1.8.2 的这行修复日志虽然简短背后却是一条完整的 URL 生成链路BASE_URL配置 →UrlManager::ConstructUrl()→ 视图辅助函数$U()→ 登录表单 action 与登录/登出重定向。理解这条链路不仅能解释 1.8.2 修了什么更能让你在子目录部署、反向代理、禁用 URL 重写等场景下准确配置BASE_URL与BASE_PATH并快速定位登录跳转错乱类问题的根因。相关文件索引changelog/17_1.8.2_2018-04-18.md本次修复的原始变更记录changelog/16_1.8.1_2018-04-18.mdBASE_URL 配置项引入记录config-dist.phpBASE_PATH / BASE_URL 完整注释与示例helpers/UrlManager.phpURL 构造核心实现views/login.blade.php登录表单 action 的 URL 生成controllers/LoginController.php登录处理与跳转逻辑app.php配置哈希、视图缓存与 BASE_PATH 注入routes.php登录路由注册【免费下载链接】grocyERP beyond your fridge - Grocy is a web-based self-hosted groceries household management solution for your home项目地址: https://gitcode.com/GitHub_Trending/gr/grocy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门