You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置.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>

遇到的问题

  1. 访问多级斜杠路径(如/asdasd/asdas)时,页面内容显示正常,但控制台抛出Uncaught SyntaxError: Unexpected token '<'错误
  2. 访问/asd、/asd.php这类路径时,希望重定向后地址栏自动移除这些路径(仅显示根域名)
  3. 已测试场景:
    • <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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:05:53