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

如何在Apache .htaccess中排除特定URI进行全局请求重写?

问题

我的根目录结构如下:

/public
/src
/script
/etc

我用以下.htaccess代码成功把所有请求重写到/public文件夹:

RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} /public/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]
RewriteRule ^((?!public/).*)$ public/$1 [L,NC]

但现在从浏览器访问/script/script.php时,服务器返回:

NOT FOUND The requested URL was not found on this server.

我不熟悉Apache 2的.htaccess配置(得在共享主机上用),试过Stack Overflow上的方案但没解决,求可行的解决方法。

解决方案

当前规则会把所有不带public/前缀的请求都转去public/目录,所以访问/script/script.php时,服务器会去/public/script/script.php找文件,自然找不到。

要让/script/这类非public目录的请求正常访问,得在转发规则里排除这些目录。修改.htaccess如下:

RewriteEngine On
RewriteBase /

# 把直接访问public/的请求重定向到根路径对应资源
RewriteCond %{THE_REQUEST} /public/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]

# 排除需要直接访问的目录:script、src、etc
RewriteCond %{REQUEST_URI} !^/(script|src|etc)/ [NC]
# 剩余请求转发到public目录
RewriteRule ^((?!public/).*)$ public/$1 [L,NC]

关键说明

  • 新增的RewriteCond规则会过滤掉以/script/、/src/、/etc/开头的请求,这些请求不会被转发到public,而是直接访问对应目录下的文件。
  • 之后如果有新的需要直接访问的目录,直接在括号里加就行,比如改成(script|src|etc|new_folder)。
  • [NC]标记是忽略大小写,确保路径大小写不同时规则也能生效。

内容的提问来源于stack exchange,提问作者Thibaud Lafont

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:25:42