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

Ale*_*ani 4 apache .htaccess mod-rewrite redirect url-rewriting

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

这是我的.htaccess

RewriteEngine On
RewriteRule ^.*$ subfolder/public [NC,L]
Run Code Online (Sandbox Code Playgroud)

编辑

第一个 .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]
Run Code Online (Sandbox Code Playgroud)

MrW*_*ite 6

抱歉,刚刚意识到发生了什么。.htaccess如评论中所述,它与子目录中的第二个文件无关。

RewriteRule ^.*$ subfolder/public [NC,L]
Run Code Online (Sandbox Code Playgroud)

由于public是文件系统上的物理目录,因此在内部重写该目录时需要包含尾部斜杠。否则, mod_dir 将尝试通过附加斜杠来“修复” URL - 这就是外部重定向的来源。(mod_dir 隐式地触发了从subfolder/publicto的外部重定向subfolder/public/。)

因此,请在您的根.htaccess文件中尝试以下操作:

RewriteRule .* subfolder/public/ [L]
Run Code Online (Sandbox Code Playgroud)

重要的是尾部斜杠。锚(^$上)RewriteRule 的图案不是必需的,因为你是匹配的一切。而且NC也不需要为同一个原因标志。

与往常一样,请确保在测试前清除浏览器缓存。


更新#1:上面的单个指令将所有内容(包括静态资源)重写到目录中 subfolder/public/,然后该目录依赖.htaccess子目录中的第二个文件来正确路由请求。为了允许正确重写静态资源(在 HTML 中表示为根相对 URL 路径,形式为"/js/myjs.js"),那么您将需要额外的指令来重写这些。

例如,专门将所有.js.css文件重写到实际位置/subfolder/public/...

# Rewrite static resources
RewriteRule (.+\.(?:js|css))$ subfolder/public/$1 [L]

# Rewrite everything else to the "public" directory
RewriteRule .* subfolder/public/ [L]
Run Code Online (Sandbox Code Playgroud)

更新#2:为了使上述更通用,并重写任何静态资源(图像、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]
Run Code Online (Sandbox Code Playgroud)

这意味着如果任何.css不存在,它将被传递到subfolder/public/.