使用 .htaccess 将子文件夹内容映射到根目录

问题描述 投票:0回答:1

我有以下目录结构:

/html
  .git
  project-folder
    build
      index.html
  .htaccess

apache 服务器将目录

/html
视为域
https://example.com
的根文件夹。

我应该在

.htaccess
中添加什么才能将
index.html
视为域
https://example.com
的根索引?

DirectoryIndex 有帮助吗?如果是的话,那么RewriteRule

RewriteCond
怎么写呢?

apache .htaccess
1个回答
0
投票
DirectoryIndex 有帮助吗?

并非如此,这只会帮助处理对根目录本身的请求,而不会帮助

/<something>

。应将其保留为默认值,以便从请求的目录(包括 
index.html
)提供 
/html/project-folder/build
。例如:

DirectoryIndex index.html
我假设您不需要公开访问 

/build

 子目录之外的任何内容。我还假设您使用的是 Apache 2.4(而不是 Apache 2.2)。

这里有两种方法,具体取决于您是否有一个或两个

.htaccess

 文件。第二个位于 
/build
 子目录中。

文档根目录中的一个

.htaccess
 文件

在根

.htaccess

 文件(位于 
/html/.htaccess
)中,您可以在内部将尚未针对 
/project-folder/build 子目录的任何 internal
 请求重写到该子目录。

任何对

/project-folder/build

 的外部请求都需要从外部重定向回根(或完全阻止)。

例如:

# Single .htaccess file in document root at /html/.htaccess DirectoryIndex index.html RewriteEngine On # Redirect any direct requests to the subdirectory back to root RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^project-folder/build/(.*) /$1 [R=301,L] # Internally rewrite all requests to the subdirectory RewriteRule (.*) project-folder/build/$1 [END]

REDIRECT_STATUS

 指令中使用 
RewriteCond
 环境变量可确保我们仅检查直接(外部)请求,而不检查内部重写(通过其他规则)。尽管在这个有限的示例中,在第二条规则上使用 
END
 标志会使此检查变得多余。

两个

.htaccess
 文件(一个在文档根目录中,一个在项目子目录中)

如果项目(目录)有自己的

.htaccess

 文件,并且还包含 mod_rewrite 指令,则这是必需的。

在这种情况下,外部重定向回根目录需要位于项目文件夹的

.htaccess

 文件中(而不是位于根 
.htaccess
 文件中),这是因为 mod_rewrite 指令不会被继承(默认情况下)。

例如:

# /html/.htaccess (in the document root) DirectoryIndex index.html RewriteEngine On # Internally rewrite all requests to the subdirectory RewriteRule (.*) project-folder/build/$1 [L]
在这种情况下,在上述规则中使用

L

还是
END
并不重要。

# /html/project-folder/build/.htaccess RewriteEngine On # Redirect any direct requests to this subdirectory back to root RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule (.*) /$1 [R=301,L]
乍一看,上面的重定向可能看起来像重定向回自身,但请注意,捕获的 URL 路径(来自 

RewriteRule

 
pattern)是相对于包含 .htaccess
 文件的目录。因此,对 
/project-folder/build/<something>
 的请求将被重定向回“根”中的 
/<something>

始终首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。

© www.soinside.com 2019 - 2024. All rights reserved.