如何配置.htaccess重定向且不阻塞PHP API,解决子路径报错问题
问题解决:URL重定向异常与资源加载错误
现有代码与配置
根目录index.php
<?php require_once('./../private/Router.php'); new Router(); ?> <html lang="en"> ...
Router类(private/Router.php)
<?php require_once('Api.php'); class Router { public function __construct() { $uri = $_SERVER['REQUEST_URI']; $method = $_SERVER['REQUEST_METHOD']; if (preg_match('/^\/api\//', $uri)) { $endpoint = str_replace('/api/', '', $uri); $api = new Api(); $data = null; switch ($endpoint) { case 'players': $data = $api->getPlayers(); break; } if ($data != null) { $api->sendResponse($data); } else { $api->sendResponse(['error' => 'Endpoint not found'], 404); } exit; } } }
当前.htaccess配置
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ / [QSA,L] </IfModule>
遇到的问题
- 访问多级斜杠路径(如
/asdasd/asdas)时,页面内容显示正常,但控制台抛出Uncaught SyntaxError: Unexpected token '<'错误 - 访问
/asd、/asd.php这类路径时,希望重定向后地址栏自动移除这些路径(仅显示根域名) - 已测试场景:
<domain>:正常<domain>/api/players:正常<domain>/api/players2:正常<domain>/asd:地址栏保留/asd,需移除<domain>/asd.php:地址栏保留/asd.php,需移除<domain>/asd/asd:页面显示但有语法错误
解决方案
1. 修复多级路径的资源加载错误
报错原因:访问/asd/asd时,页面中静态资源(CSS、JS、图片)若使用相对路径,浏览器会将当前路径视为基准路径,比如原本的style.css会被请求为/asd/asd/style.css。该路径被重定向到index.php后返回HTML内容,而非预期的静态资源,导致浏览器解析时抛出语法错误。
解决办法:
- 所有静态资源改用绝对路径(以
/开头),例如:<link rel="stylesheet" href="/style.css"> <script src="/app.js"></script> - 或在HTML的
<head>标签中添加基准路径配置:
此配置会让所有相对路径自动以根域名作为基准。<base href="/">
2. 修改.htaccess实现地址栏路径移除(外部重定向)
当前配置是内部重写,仅服务器内部跳转,地址栏不会变化。要实现地址栏路径移除,需改为外部重定向,同时排除API路径避免接口功能受影响:
修改后的.htaccess配置:
<IfModule mod_rewrite.c> RewriteEngine On # 排除API路径,确保接口正常访问 RewriteRule ^api/ - [L] # 真实存在的文件或目录直接访问,不做重定向 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 重定向所有其他路径到根目录,地址栏同步更新 RewriteRule ^(.*)$ / [R=301,L] </IfModule>
R=301为永久重定向,适合生产环境;R=302为临时重定向,适合测试阶段- 先排除API路径,保证
/api/xxx接口不受重定向影响 - 优先处理真实文件/目录,避免静态资源访问异常
3. 验证测试场景
修改后重新测试:
<domain>/asd:地址栏自动跳转到<domain>,页面正常显示<domain>/asd.php:地址栏自动跳转到<domain>,页面正常显示<domain>/asd/asd:地址栏自动跳转到<domain>,无语法错误- API路径功能保持正常
内容的提问来源于stack exchange,提问作者RoyBlunk
相关产品推荐
相关产品推荐

