抱歉,刚刚意识到发生了什么事。和第二个没有关系.htaccess
文件位于子目录中,如注释中所述。
RewriteRule ^.*$ subfolder/public [NC,L]
Since public
是文件系统上的物理目录,在内部重写该目录时需要包含尾部斜杠。否则,mod_dir 将尝试通过附加斜杠来“修复”URL - 这就是外部重定向的来源。 (mod_dir 隐式触发外部重定向subfolder/public
to subfolder/public/
.)
因此,请在您的根目录中尝试以下操作.htaccess
file:
RewriteRule .* subfolder/public/ [L]
重要的是尾部斜杠。锚点 (^
and $
)在RewriteRule
pattern不是必需的,因为您正在匹配一切。还有NC
出于同样的原因,也不需要标志。
与往常一样,在测试之前确保浏览器缓存是清除的。
更新#1:上面的单个指令重写一切,包括静态资源,到目录 subfolder/public/
然后依赖于第二个.htaccess
文件位于子目录中以正确路由请求。为了允许正确重写静态资源(在 HTML 中表示为根相对 URL 路径,其形式为"/js/myjs.js"
)那么您将需要额外的指令来重写它们。
例如,专门重写所有.js
and .css
文件到真实位置/subfolder/public/...
# Rewrite static resources
RewriteRule (.+\.(?:js|css))$ subfolder/public/$1 [L]
# Rewrite everything else to the "public" directory
RewriteRule .* subfolder/public/ [L]
更新#2:为了使上述更通用,并重写any静态资源(图像、PDF、.txt 等)我们可以在重写之前检查文件是否存在,例如:
# Rewrite static resources
RewriteCond %{DOCUMENT_ROOT}/subfolder/public/$1 -f
RewriteRule (.+) subfolder/public/$1 [L]
# Rewrite everything else to the "public" directory
RewriteRule .* subfolder/public/ [L]
这意味着如果有的话.css
不存在它将被传递到subfolder/public/
.