如果不是根路由,如何使用 .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/signupwww.example.com/app/index1.html 时进行重定向。

但我想加载 app/index1.html 而无需重定向。请帮助我。

使用您展示的示例,请尝试遵循 .htaccess 规则。在测试您的网址之前,请确保以下事项:

  • 确保您的 .htaccess 文件、index.htmlapp 文件夹位于同一个 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 不包含点,那么它们自然不会映射到任何现有文件。