我正在构建一项资源被分为类别的服务,例如: example.com/category/foo
代表" foo" (想想:类似于SO标签)。
可以随时添加新类别,并且在尝试查看尚未存在的类别时,用户可以建议添加该类别。
但是,我想直接禁止某些类别名称(例如NSFW条款)。这意味着(假设" bar"就是这样一个名字)example.com/category/bar
不仅从未存在过,而且保证将来永远不会存在。
哪种HTTP状态代码适合这种情况?
想到了几个想法:
410 Gone - 虽然这表明资源将来无法使用,但我不确定它是否合适,因为它似乎也是合适的意味着它曾经存在于过去。
400错误请求 - 请求在技术上没有格式错误,因此这可能不是可行的方法。
404 Not Found 最初似乎是合乎逻辑的选择,但并没有传达禁令的永久性,特别是因为我计划将404用于不使用的类别。但仍然存在,但可以建议。
301永久移动并重定向到另一个页面,主页或其他页面解释某些类别名称被禁止。
答案 0 :(得分:1)
我不认为在HTTP的规范中存在“永远不会存在”这样的事情。让我们稍微区别一点:
所以为了保持简单愚蠢,你应该坚持使用HTTP语义。如果有人点击了一个网址:example.com/category/{cat}
,您要么知道{cat}(它在您的数据库中并且有一个有效的名称,对吗?)并处理请求safley,或者您之前从未见过{cat}而您只是返回404.
毕竟有一个无限的可能值,可以用于{cat},所有这些值都是有效的URL。
希望有所帮助
答案 1 :(得分:0)
我建议 410 Gone 是一个合适的回复,假设您的网络客户端很常见且正确实施了http规范(最受欢迎的那些)。
在此处查看此页面时:Status Code Definitions
关于410的消息说:
10.4.11 410 Gone
请求的资源在服务器上不再可用,没有 转发地址是已知的。预计这种情况会发生 被视为永久性具有链接编辑功能的客户端应该 用户批准后删除对Request-URI的引用。如果 服务器不知道,或无法确定,无论是否 条件是永久的,状态代码404(未找到)应该是 用来代替。除非另有说明,否则此响应是可缓存的。
410响应主要用于协助网络任务 通过通知收件人资源是维护 故意不可用,服务器所有者希望如此 将删除该资源的远程链接。这样的事件很常见 限时,促销服务和属于的资源 个人不再在服务器的网站上工作。它不是 必须将所有永久不可用的资源标记为"已消失"要么 保持标记任何时间长度 - 留给 服务器所有者的自由裁量权。
我认为这意味着资源现在肯定不存在,并且将来不会存在,给出你想要的永久性,除非另有说明,否则它也是可缓存的。
通常情况下,我不需要知道它之前就已经存在过了#34;我只是知道它现在并不存在,当我要求提供有关它的信息时,它如果我再次请求,将来不会存在。如果我确实需要了解某些类别在过去从未存在过(例如类别的黑名单),我可能想要一个单独的显式请求,我可以使用它来获取所有这些类别,而不是必须检查每个类别在运行时间。