htaccess - 重定向到子文件夹而不更改浏览器 URL

2023-11-21

我有一个域,其中包含具有 Web 应用程序结构的子文件夹。我添加了一个.htaccess在我的根域上指向我的子文件夹 Web 应用程序上的公共文件夹。它工作正常,但是当我输入时www.example.com浏览器 URL 更改为www.example.com/subfolder/public,但我希望它不会改变。

这是我的.htaccess:

RewriteEngine On
RewriteRule ^.*$ subfolder/public [NC,L]

EDIT

第一个 .htaccess 用于在子文件夹/公共上重定向,其中还有另一个 .htaccess 可以完成所有工作。

这里是第二个 .htaccess 的代码位于www.example.com/subfolder/public/:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

抱歉,刚刚意识到发生了什么事。和第二个没有关系.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/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

htaccess - 重定向到子文件夹而不更改浏览器 URL 的相关文章

随机推荐