如何在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
相关产品推荐
相关产品推荐

