0

0

如何通过 .htaccess 正确重写静态资源路径并避免重定向循环

聖光之護

聖光之護

发布时间:2026-01-13 10:37:17

|

994人浏览过

|

来源于php中文网

原创

如何通过 .htaccess 正确重写静态资源路径并避免重定向循环

本文详解如何配置 apache 的 `.htaccess` 文件,使 `/css/main.css` 等静态资源请求自动映射到 `public/css/main.css`,同时确保 mvc 路由不冲突、无重定向循环。

在基于 MVC 架构的 PHP 应用中,将 Web 可访问文件(如 CSS、JS、图片)统一置于 public/ 目录是常见且安全的做法。但若希望前端 HTML 中直接使用 而非 ,就必须借助 .htaccess 实现「透明路径重写」——即浏览器请求 /css/main.css 时,服务器内部将其指向 public/css/main.css,而 URL 地址栏保持不变。

关键挑战在于:避免重写规则间的冲突与无限重定向循环。原始配置中 RedirectMatch 与后续 RewriteRule 未做前置拦截,导致对已重写为 public/xxx 的请求再次匹配、反复重写,最终触发 500 错误或浏览器重定向失败。

以下是经过生产验证的、结构清晰且具备防御性的 .htaccess 配置(适配子目录部署场景,如 /BU/cs-602/developer-story/):


    RewriteEngine On
    RewriteBase /BU/cs-602/developer-story/

    # 1. 首页请求:/ 或 /index.* → public/index.php(终止)
    RewriteRule ^(\/||.*index\..*)$ public/index.php [L,QSA]

    # 2. 安全短路:若请求路径已含 "public/",直接放行(防止循环)
    RewriteRule ^(.*public\/.*)$ $1 [L,QSA]

    # 3. 静态资源识别:匹配非 PHP/HTML/HTM 的扩展名(如 .css, .js, .png)
    RewriteCond %{REQUEST_URI} \.(?!php|htm|html)[a-zA-Z0-9]+$ [NC]
    # → 重写为 public/ + 原路径,并终止(L)
    RewriteRule ^(.*)$ public/$1 [L,QSA]

    # 4. MVC 路由兜底:仅当请求路径不是真实文件/目录/符号链接时,交由 index.php 处理
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteRule ^([\w\d\s\-\_\/\%]*)$ public/index.php?p=$1 [L,QSA]

核心设计逻辑说明:

Viggle AI
Viggle AI

Viggle AI是一个AI驱动的3D动画生成平台,可以帮助用户创建可控角色的3D动画视频。

下载
  • 顺序即优先级:Apache 按从上到下执行规则,[L](Last)标志确保匹配后立即终止当前轮次,防止后续规则干扰;
  • 短路防御机制:第 2 条规则显式放行所有含 public/ 的路径,彻底阻断「public/css/main.css → 再次被识别为静态资源 → 重写为 public/public/css/main.css」的死循环;
  • 精准静态资源判定:使用 RewriteCond + 正则 \.(?!php|htm|html)[a-zA-Z0-9]+$ 安全排除脚本类文件,[NC] 保证大小写不敏感(.CSS 同样生效);
  • 子目录兼容性:RewriteBase 确保所有相对路径重写均基于实际部署路径(如 /BU/cs-602/developer-story/),无需硬编码完整 URL。

⚠️ 注意事项:

  • 确保 Apache 已启用 mod_rewrite 模块,并在虚拟主机配置中允许 .htaccess 覆盖(AllowOverride All);
  • 开发阶段务必开启 Apache 错误日志(LogLevel warn rewrite:trace3),可快速定位重写循环或正则匹配失败问题;
  • HTML 中资源引用保持简洁:如何通过 .htaccess 正确重写静态资源路径并避免重定向循环 即可,无需添加 public/ 前缀;
  • 若需支持更多静态类型(如 .woff2, .svg),可在 RewriteCond 正则中扩展:\.(?!php|htm|html|woff2|svg)[a-zA-Z0-9]+$。

该方案已在本地开发环境(XAMPP/MAMP)及 Linux 服务器实测通过,兼顾安全性、可维护性与 MVC 架构规范,是子目录部署型 PHP 应用的标准实践之一。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2449

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1571

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1473

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

951

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1414

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1305

2023.11.13

PHP 表单处理与文件上传安全实战
PHP 表单处理与文件上传安全实战

本专题聚焦 PHP 在表单处理与文件上传场景中的实战与安全问题,系统讲解表单数据获取与校验、XSS 与 CSRF 防护、文件类型与大小限制、上传目录安全配置、恶意文件识别以及常见安全漏洞的防范策略。通过贴近真实业务的案例,帮助学习者掌握 安全、规范地处理用户输入与文件上传的完整开发流程。

1

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号