【问题标题】:Apache: forcing a 404 status codeApache:强制 404 状态码
【发布时间】:2018-02-25 19:58:27
【问题描述】:

我正在使用一个无法修改的 tomcat 应用程序,尽管我可以完全控制在它前面设置的 apache(使用反向代理)。

当应用程序遇到不再有效的 URL(即 ID 不再存在或格式错误)时,将执行 302 重定向到 pagenotavailable.jsp

我需要想办法让它们返回 404,以便这些 URL 从搜索引擎索引中删除。

我想出的一种可能性是设置一个 mod_rewrite 重定向,从 pagenotavailable.jsp 到我创建的名为 404.html 的页面:

RewriteEngine on
RewriteRule ^/pagenotavailable\.jsp /404.html [NC,R=404,L]    

或者只是这个,因为 404.html 已经设置为 ErrorDocument:

RewriteRule ^/pagenotavailable\.jsp$ - [R=404]

这显示了我的自定义404.html 页面的内容,但是 URL 没有更新(仍然是 pagenotavailable.jsp)并且状态码仍然是 302。

感谢任何我没有得到 404 的想法,以及任何替代方法!

【问题讨论】:

    标签: apache tomcat mod-rewrite


    【解决方案1】:

    如果您使用 302 进行响应,则客户端将始终更新其 URL(例如在 URL 栏中)以显示 .../pagenotavailable.html。如果您希望这种情况消失,则必须再次重定向到您的首选 URL。唯一的其他选择是修改应用程序,使其不执行重定向,而是完全在服务器端处理的“转发”。但是您特别提到您不能修改网络应用程序,所以...

    如果状态码仍然是302,我会感到非常惊讶...当客户端收到302 响应时,它应该对302 响应标头中提供的Location 执行GET。如果有的话,如果响应代码未设置为 404,我希望您的 404.html 内容得到 200 响应。

    [R=xxx] 标志告诉mod_rewrite 发出重定向,该重定向必须是3xx 响应代码。你可以使用 404,但你应该是aware of the caveats。该页面说明了 Location 标头会发生什么(即什么都没有),它说它将暗示 [L] 标志,但它没有说明实际将什么响应代码发送给客户端。

    使用RewriteRule 将页面重写为实际上不存在的内容怎么样?

    RewriteRule ^pagenotavailabe.jsp$ /does-not-exist.html
    

    ...然后让您的标准 404 处理程序处理错误(并返回 404.html 的内容以及 404 协议响应)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      相关资源
      最近更新 更多