网页的服务器 returns 404,但页面在浏览器中显示正常 - 为什么?
Server returns 404 for a web page, but page is showing fine in browser - why?
一个奇怪的网页出现在我面前。 (作为一名开发人员,我必须解开这个谜团。)
在任何浏览器中访问网页时,一切似乎都正常。网页按预期显示。
但是在控制台中查看服务器时 returns 一个 404 状态代码:
那么浏览器为什么要渲染页面?
查看正文显示有效 HTML 返回:
稍等。响应 404 并沿途发送 HTML?浏览器呈现它??
为什么会这样?这是一些服务器配置错误吗?或者这里发生了一些我不明白的聪明事?有意将服务器配置为这样的行为是否有实际原因?
Another answer on Stack Overflow contains some interesting information: A HTTP status code of 404 plus HTML response body is actually recommended by the spec.
The 4xx class of status code is intended for cases in which the
client seems to have erred. Except when responding to a HEAD
request, the server SHOULD include a representation containing an
explanation of the error situation, and whether it is a temporary or
permanent condition. These status codes are applicable to any
request method. User agents SHOULD display any included
representation to the user.
这给我留下了两种可能的解释:
解释一:服务器错误
- 服务器错误returns一个404状态码
- 浏览器认为响应主体包含有关错误的详细信息并显示它 - 对于最终用户这是实际页面
解释2:故意打败爬虫和页面观察者。
- 服务器 returns 404 故意 - 非浏览器用户代理不会处理结果,因为他们将其解释为错误
- 浏览器不受影响,只要页面正在显示,最终用户不关心
如果您不希望自己的网页被编入索引,那么第二个确实有点聪明。
我遇到过同样的情况。我的门户托管在 tomcat 服务器中。当主机名和 tomcat 目录路径被命中时,门户被加载。但是在加载网页时重定向到 deep-link URL 并呈现页面。但是如果你直接在浏览器中点击 deep link URL 它会在开发工具的网络选项卡中给你 404 错误,尽管网页可以正常呈现。
发生这种情况是因为在您的服务器配置文件中的任何地方都没有像您的 deep-link URL 这样的资源,因此当它搜索该资源时,它找不到资源并且 returns 404 在开发工具中的网络选项卡。
但是浏览器对资源 URL 的行为不同。它首先加载并连接到资源的主机名,当成功返回时根据配置文件设置重定向并呈现 deep-link URL 资源 HTML,正确设置样式内容.
注意:我不知道这个问题是因为我在 .htaccess 还是我的 CMS 不够严格。
在我设计的 .htaccess 示例中,我有以下规则来忽略 CMS 处理这些目录。
RewriteCond !^(branch|css|js|html|images) [NC]
我的 CMS 模板中也有一个 branches 目录(在 CMS 中创建)。我想我的 .htaccess 规则在这里不够严格。我不得不将 branch
更改为 branch\/
,如下所示:
RewriteCond !^(branch\/|css|js|html|images) [NC]
只有这样,页面才会加载 而控制台中没有 404。
一个奇怪的网页出现在我面前。 (作为一名开发人员,我必须解开这个谜团。)
在任何浏览器中访问网页时,一切似乎都正常。网页按预期显示。
但是在控制台中查看服务器时 returns 一个 404 状态代码:
那么浏览器为什么要渲染页面?
查看正文显示有效 HTML 返回:
稍等。响应 404 并沿途发送 HTML?浏览器呈现它??
为什么会这样?这是一些服务器配置错误吗?或者这里发生了一些我不明白的聪明事?有意将服务器配置为这样的行为是否有实际原因?
Another answer on Stack Overflow contains some interesting information: A HTTP status code of 404 plus HTML response body is actually recommended by the spec.
The 4xx class of status code is intended for cases in which the
client seems to have erred. Except when responding to a HEAD
request, the server SHOULD include a representation containing an
explanation of the error situation, and whether it is a temporary or
permanent condition. These status codes are applicable to any
request method. User agents SHOULD display any included
representation to the user.
这给我留下了两种可能的解释:
解释一:服务器错误
- 服务器错误returns一个404状态码
- 浏览器认为响应主体包含有关错误的详细信息并显示它 - 对于最终用户这是实际页面
解释2:故意打败爬虫和页面观察者。
- 服务器 returns 404 故意 - 非浏览器用户代理不会处理结果,因为他们将其解释为错误
- 浏览器不受影响,只要页面正在显示,最终用户不关心
如果您不希望自己的网页被编入索引,那么第二个确实有点聪明。
我遇到过同样的情况。我的门户托管在 tomcat 服务器中。当主机名和 tomcat 目录路径被命中时,门户被加载。但是在加载网页时重定向到 deep-link URL 并呈现页面。但是如果你直接在浏览器中点击 deep link URL 它会在开发工具的网络选项卡中给你 404 错误,尽管网页可以正常呈现。 发生这种情况是因为在您的服务器配置文件中的任何地方都没有像您的 deep-link URL 这样的资源,因此当它搜索该资源时,它找不到资源并且 returns 404 在开发工具中的网络选项卡。 但是浏览器对资源 URL 的行为不同。它首先加载并连接到资源的主机名,当成功返回时根据配置文件设置重定向并呈现 deep-link URL 资源 HTML,正确设置样式内容.
注意:我不知道这个问题是因为我在 .htaccess 还是我的 CMS 不够严格。
在我设计的 .htaccess 示例中,我有以下规则来忽略 CMS 处理这些目录。
RewriteCond !^(branch|css|js|html|images) [NC]
我的 CMS 模板中也有一个 branches 目录(在 CMS 中创建)。我想我的 .htaccess 规则在这里不够严格。我不得不将 branch
更改为 branch\/
,如下所示:
RewriteCond !^(branch\/|css|js|html|images) [NC]
只有这样,页面才会加载 而控制台中没有 404。