如何仅使用隐藏 .html 文件扩展名的 cpanel 为网站制作子页面的子页面?

How do you make a subpage of a subpage for a website using only cpanel that hides the .html file extension?

我有一个网站,其子页面的 URL 如下所示:

https://www.example.com/hello/world
https://www.example.com/hello/earth

在 cpanel 中,这些页面的文件结构如下所示:

[folder]
 hello
 └ [folder]
    world.html
    earth.html
 .htaccess
 index.html

我的 .htaccess 文件有以下规则来解释缺少的 .html 文件扩展名:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ .html [NC,L]

如何使 https://www.example.com/hello 加载为工作网页? 我试过简单地将 hello.html 添加到文件夹中,但无济于事——像这样:

[folder]
 hello
 └ [folder]
    world.html
    earth.html
 .htaccess
 hello.html
 index.html

当我在该示例中尝试访问 https://www.example.com/hello 时,它会将我带到我的 404 页面,但 .../hello/world.../hello/earth 仍然有效。 https://www.example.com/hello.html 确实有效,但我不希望最终用户看到 .html 文件扩展名。

在这种情况下,我还没有找到隐藏 .html 文件扩展名的解决方案。我们将不胜感激!

When I attempt to access https://www.example.com/hello in that example, it leads me to my 404 page

因为您有一个同名目录并且(默认情况下)mod_dir 将发出 301 重定向到 fix/append 尾部斜杠。当您的指令尝试通过将请求(现在带有尾部斜杠)从 /hello/ 重写为 /hello/.html 来附加 .html 文件扩展名(这自然会导致404).

要防止 mod_dir 在目录请求中附加尾部斜杠,您可以在文件顶部包含以下指令:

# Prevent mod_dir appending a trailing to directory requests
DirectorySlash Off

# Disable auto-generated directory listings (mod_autoindex)
Options -Indexes

您需要确保在测试之前清除浏览器缓存,因为早期的 301(永久)重定向(通过 mod_dir)将被浏览器永久缓存。

为了安全起见,您还需要确保 auto-generated 目录列表被禁用(除非您明确想要此行为),因为当 DirectoryIndex Off 被设置并且您请求一个没有尾部斜杠的目录时, mod_autoindex 仍会生成目录列表,即使该目录中存在 Directoryindex 文档。


备选方案

或者,您仍然可以允许 mod_dir 附加尾部斜杠(因此对 /hello 的请求仍会重定向到 /hello/,因此 /hello/ 是规范的URL),但允许在 RewriteRule 模式 中使用可选的尾部斜杠,但使用 non-greedy 正则表达式将其从捕获子模式中排除。

例如:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+?)/?$ .html [L]

对于 /hello/ 的请求,然后 hello 被带括号的子模式捕获,因此它被重写为 hello.html 如上所述。