我有以下目录结构:
/html
.git
project-folder
build
index.html
.htaccess
apache 服务器将目录
/html
视为域 https://example.com
的根文件夹。
我应该在
.htaccess
中添加什么才能将 index.html
视为域 https://example.com
的根索引?
DirectoryIndex 有帮助吗?如果是的话,那么RewriteRule
和
RewriteCond
怎么写呢?
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(临时)重定向进行测试,以避免潜在的缓存问题。