如何仅使用隐藏 .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
如上所述。
我有一个网站,其子页面的 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
如上所述。