如果不是根路由,如何使用 .htaccess 重定向到子目录索引文件
How to redirect if not root route to subdirectory index file with .htaccess
我有两个网页。
我想将这两个页面部署在一个域中。
当我调用根URL时,我想在根目录中加载index.html
,而对于其他URL,我想在[=14]中加载index1.html
=] 目录.
这是目录结构。
www.example.com/index.html
www.example.com/app/index1.html
例如:
当请求 www.example.com
正在加载 index.html
对于www.example.com/login
正在加载 /app/index1.html
对于www.example.com/signup
正在加载 /app/index1.html
这是我试过的。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ /app/index1.html [R=301,L]
</IfModule>
这会在我请求 www.example.com/signup
到 www.example.com/app/index1.html
时进行重定向。
但我想加载 app/index1.html
而无需重定向。请帮助我。
使用您展示的示例,请尝试遵循 .htaccess 规则。在测试您的网址之前,请确保以下事项:
- 确保您的
.htaccess
文件、index.html
和 app
文件夹位于同一个 root
文件夹中。
- 确保
/app
文件夹中有 index1.html
文件。
- 确保在测试您的 URL 之前清除您的浏览器缓存。
RewriteEngine ON
##Rule from OP's attempt to block direct access of index.html file.
RewriteRule ^index\.html$ - [NC,L]
##Rule to handle only url www.example.com here.
RewriteRule ^/?$ /index.html [QSA,NC,L]
##Rules to handle rest of the cases here..
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ /app/index1.html [QSA,NC,L]
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ /app/index1.html [R=301,L]
</IfModule>
你基本上只需要删除最后一个 RewriteRule
指令上的 R
(redirect
) 标志。但这可以优化:
DirectoryIndex index.html
RewriteEngine On
RewriteRule ^app/index1\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule . app/index1.html [L]
mod_dir(即 DirectoryIndex
)从根目录服务 /index.html
。这可能已在服务器配置中配置,因此此处可能不需要 DirectoryIndex
指令。
第一个 RewriteRule
指令是为了防止不必要的文件系统检查而进行的优化。这应该与被重写的文件相匹配。 IE。 /app/index1.html
(不是 /index.html
)。
最后一个 RewriteRule
匹配单个字符(即 .
- 点),因此排除了对根目录的请求,从而防止每次请求根目录时进行不必要的文件系统检查.另一方面,正则表达式 ^(.*)$
匹配 所有内容 ,包括根目录(目录检查失败 - 第二个 条件 / RewriteCond
指令)。
除非您使用符号链接,否则您可以删除第 3 个 条件.
根据您的 URL 格式,您可以使正则表达式更具限制性,并可能删除第一个 condition 检查请求是否映射到一个文件(文件系统检查相对昂贵)。例如。您的网址是否包含点?你给出的两个例子没有。点自然地分隔文件扩展名,因此如果您的 URL 不包含点,那么它们自然不会映射到任何现有文件。
我有两个网页。
我想将这两个页面部署在一个域中。
当我调用根URL时,我想在根目录中加载index.html
,而对于其他URL,我想在[=14]中加载index1.html
=] 目录.
这是目录结构。
www.example.com/index.html
www.example.com/app/index1.html
例如:
当请求 www.example.com
正在加载 index.html
对于www.example.com/login
正在加载 /app/index1.html
对于www.example.com/signup
正在加载 /app/index1.html
这是我试过的。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ /app/index1.html [R=301,L]
</IfModule>
这会在我请求 www.example.com/signup
到 www.example.com/app/index1.html
时进行重定向。
但我想加载 app/index1.html
而无需重定向。请帮助我。
使用您展示的示例,请尝试遵循 .htaccess 规则。在测试您的网址之前,请确保以下事项:
- 确保您的
.htaccess
文件、index.html
和app
文件夹位于同一个root
文件夹中。 - 确保
/app
文件夹中有index1.html
文件。 - 确保在测试您的 URL 之前清除您的浏览器缓存。
RewriteEngine ON
##Rule from OP's attempt to block direct access of index.html file.
RewriteRule ^index\.html$ - [NC,L]
##Rule to handle only url www.example.com here.
RewriteRule ^/?$ /index.html [QSA,NC,L]
##Rules to handle rest of the cases here..
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ /app/index1.html [QSA,NC,L]
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.*)$ /app/index1.html [R=301,L] </IfModule>
你基本上只需要删除最后一个 RewriteRule
指令上的 R
(redirect
) 标志。但这可以优化:
DirectoryIndex index.html
RewriteEngine On
RewriteRule ^app/index1\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule . app/index1.html [L]
mod_dir(即 DirectoryIndex
)从根目录服务 /index.html
。这可能已在服务器配置中配置,因此此处可能不需要 DirectoryIndex
指令。
第一个
RewriteRule
指令是为了防止不必要的文件系统检查而进行的优化。这应该与被重写的文件相匹配。 IE。/app/index1.html
(不是/index.html
)。最后一个
RewriteRule
匹配单个字符(即.
- 点),因此排除了对根目录的请求,从而防止每次请求根目录时进行不必要的文件系统检查.另一方面,正则表达式^(.*)$
匹配 所有内容 ,包括根目录(目录检查失败 - 第二个 条件 /RewriteCond
指令)。除非您使用符号链接,否则您可以删除第 3 个 条件.
根据您的 URL 格式,您可以使正则表达式更具限制性,并可能删除第一个 condition 检查请求是否映射到一个文件(文件系统检查相对昂贵)。例如。您的网址是否包含点?你给出的两个例子没有。点自然地分隔文件扩展名,因此如果您的 URL 不包含点,那么它们自然不会映射到任何现有文件。