
当 xampp 等本地服务器端口从默认的 80 改为其他端口(如 88)后,php 动态生成的资源路径未同步更新端口号,导致浏览器请求 http://localhost:88/... 资源时实际发出 http://localhost/...(缺端口),引发 404 错误。
当 xampp 等本地服务器端口从默认的 80 改为其他端口(如 88)后,php 动态生成的资源路径未同步更新端口号,导致浏览器请求 http://localhost:88/... 资源时实际发出 http://localhost/...(缺端口),引发 404 错误。
在 PHP Web 应用开发初期,常通过动态拼接 URL 构建静态资源路径(如 CSS、JS)。但若硬编码协议和域名而忽略端口,极易在非标准端口环境下失效。你当前的配置:
$path = str_replace("\", "/", "http://" . $_SERVER['SERVER_NAME'] . __DIR__ . "/");
$path = str_replace($_SERVER['DOCUMENT_ROOT'], "", $path);
define('ROOT', str_replace("app/core", "public", $path));
define('ASSETS', str_replace("app/core", "public/assets", $path));
问题核心在于:$_SERVER['SERVER_NAME'] 仅返回主机名(如 localhost),不包含端口号;而你的 XAMPP 已监听 :88,但生成的 URL 却是 http://localhost/...,浏览器自然向 :80 发起请求,最终返回 ERR_ABORTED 404。
✅ 正确做法是显式获取并拼接当前请求端口:
$port = ($_SERVER['SERVER_PORT'] == '80' || $_SERVER['SERVER_PORT'] == '443')
? ''
: ':' . $_SERVER['SERVER_PORT'];
$path = str_replace("\", "/", "http://" . $_SERVER['SERVER_NAME'] . $port . __DIR__ . "/");
$path = str_replace($_SERVER['DOCUMENT_ROOT'], "", $path);
define('ROOT', str_replace("app/core", "public", $path));
define('ASSETS', str_replace("app/core", "public/assets", $path));
? 更健壮的替代方案(推荐):
直接使用相对路径或基于 $_SERVER['REQUEST_URI'] 的上下文路径,避免协议+域名拼接。例如,在 index.php 中改为:
<link rel="stylesheet" href="/PHP-CATALOG/public/assets/catalog/css/bootstrap.min.css">
前提是确保 Web 服务器根目录(DocumentRoot)正确指向项目 public/ 目录,且 .htaccess 或虚拟主机配置支持重写(如启用 mod_rewrite)。
⚠️ 注意事项:
- 不要依赖浏览器强制刷新(Ctrl+F5)解决路径逻辑错误,404 是服务端响应,与缓存无关;
- 开发中建议统一使用 http://localhost:88 访问,并检查浏览器地址栏确认端口生效;
- 生产环境应禁用动态 URL 拼接,改用绝对路径前缀(如 /assets/)或环境变量配置 CDN 基础路径。
总结:动态构建资源 URL 时,必须完整还原客户端实际访问协议、主机、端口及路径上下文;忽视端口是本地开发常见陷阱,修正后即可恢复正常加载。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











