如何使用 .htaccess 重定向页面但也将其用作 W3 包含
Posted
技术标签:
【中文标题】如何使用 .htaccess 重定向页面但也将其用作 W3 包含【英文标题】:How to use .htaccess to redirect a page but also use it as a W3 include 【发布时间】:2022-01-20 16:00:27 【问题描述】:我正在使用 w3schools 此处显示的包含方法构建一个 html 站点
https://www.w3schools.com/howto/howto_html_include.asp
网站基本上如下所示
<div w3-include-html="navigation.html"></div>
<body>
</body>
<div w3-include-html="footer.html"></div>
当您在网站的正确页面上时效果很好,但如果我直接导航到 navigation.html,它会显示一个看起来很糟糕且无用的页面。
我尝试使用带有以下内容的 .htaccess 文件对其进行重定向,以便用户可以优雅地登陆一个页面,该页面说对不起,这不存在,点击这里等等等等......
重定向 /navigation.html /page-not-found.html
然而,这最终导致我所有真实页面上的导航栏在 page-does-not-exist.html 页面中显示 html。
有没有一种简单的方法可以使用 .htaccess 将直接输入 www.example.com/navigation.html 的用户重定向到 www.example.com/page-not-found.html,同时仍然允许我的其他页面正常“包含”它?
感谢您提供的任何帮助。
【问题讨论】:
简短的回答是:You can't do this
。如果您使用 htaccess 重定向文件,那么您最终会遇到相同的情况。如果您不希望该文件对客户端可见,您可以将其保留在文档根文件夹之外并从那里包含它。
我想这么多!谢谢....您能否详细说明一下或将我引导到显示如何从根目录以外的文件夹中包含的页面?你的意思是像服务器上的根目录一样,或者只是另一个文件夹通常可以工作?我基本上只是不希望用户能够输入 www.example.com/navigation.html 并看到它产生的看起来很奇怪的页面。
"如何从根目录以外的文件夹中包含?" - 您无法使用当前方法 (javascript) 执行此操作 - 因为您的脚本也会被阻止。只有在使用服务器端包含(例如 php 等)时才能这样做
【参考方案1】:
此方法使用 JavaScript(XMLHttpRequest
对象,即“AJAX”)向服务器上的文档发出 HTTP 请求。通常,这与客户端可能通过直接键入文件的 URL 发出的直接请求没有什么不同(从服务器的角度来看)。
您需要使 JavaScript 请求不同,以便服务器可以检测到它。
您可以将自定义 HTTP 请求标头(或覆盖 User-Agent
字符串)添加到 JavaScript 请求,并在服务器上使用 .htaccess
中的 mod_rewrite 检查此标头,以在此标头未设置为时发送替代响应预期的(即,如果直接请求文件)。
例如,根据 w3schools 的代码,在创建 XMLHttpRequest
对象后添加第二行:
xhttp = new XMLHttpRequest();
xhttp.setRequestHeader('User-Agent','XMLHTTP');
这会将 JS 请求中的 User-Agent
标头设置为 XMLHTTP
。然后我们可以使用 mod_rewrite 进行检查,如果未设置,则提供 404。
但是,您不应“重定向”到page-not-found.html
脚本。将此设置为自定义 404 错误文档,并允许 Apache 提供此服务。
例如:
ErrorDocument 404 /page-not-found.html
RewriteEngine On
RewriteCond %HTTP_USER_AGENT !=XMLHTTP
RewriteRule ^navigation\.html$ - [R=404]
任何对/navigation.html
的请求,如果User-Agent
字符串不是XMLHTTP
,则提供自定义404 错误文档,即。 /page-not-found.html
。因此,只允许来自您的脚本的请求。
注意:这不是一项安全功能,它只是防止随便在浏览器中输入 URL 的人看到内容(包括搜索引擎)。
旁白:
<div w3-include-html="navigation.html"></div> <body> </body> <div w3-include-html="footer.html"></div>
由此看来,您在 HTML body
之外包含了 HTML 元素?这不是有效的 HTML。
【讨论】:
写得真棒,我会开始尝试这个。非常感谢您为发布它所付出的努力。 (另一方面,我的意思是“主要”而不是正文……基本上是标准导航、页面数据、页脚布局。您提到“包括搜索引擎”。这是否意味着蜘蛛最终无法抓取链接包含在内?实际上似乎已经存在这个问题了....也许这是另一天的故事以上是关于如何使用 .htaccess 重定向页面但也将其用作 W3 包含的主要内容,如果未能解决你的问题,请参考以下文章
使用 .htaccess 重定向 404 而不重定向尾部斜杠