登录表单使用HEAD或OPTIONS动词而不是POST

时间:2015-06-29 16:46:12

标签: asp.net .net asp.net-mvc forms http

我有一个非常奇怪的问题。我刚刚将应用程序部署到生产中。我有两种登录操作方法:

AccountController
   [HttpGet]Login();
   [HttpPost]Login(..);

呈现以捕获登录信息并执行帖子的表单是一种简单的形式:

<form action="/Account/Login" class=" form-horizontal" method="post" novalidate="novalidate"><input name="__RequestVerificationToken" type="hidden" value="..">
.
.
</form>

我还在控制器上记录未处理的操作,该操作将消息写入事件日志。这是我看到的消息:

Protected Overrides Sub HandleUnknownAction(actionName As String)
    EventLog.WriteEntry("Application", "Controller '" + Me.GetType().Name + "' does not have an action '" + actionName + "' for a request of type '" + Me.ControllerContext.HttpContext.Request.HttpMethod + "'.")
End Sub

我看到此消息已记录:

  

控制器'AccountController'没有针对'HEAD'类型的请求的操作'Login'。   控制器'AccountController'没有针对'OPTIONS'类型请求的操作'Login'。

知道为什么请求以HEAD或OPTIONS的形式出现?我不知道用户是如何尝试连接到应用程序的。

1 个答案:

答案 0 :(得分:0)

为了确保您还应该检查使用该请求记录的用户代理字符串(如果可用),但我敢打赌 bot 检查您的主页(可能重定向到登录页)。

另见googlebot head request。我不鼓励用户代理字符串过滤,除非你想了解这个主题(并且无论如何机器人可能会伪造搜索引擎蜘蛛的用户代理字符串)。

他们通常使用正常 GET请求,但有些机器人(尝试优化带宽使用?)首先尝试使用HEADOPTIONS

您有两种选择AFAIK:提供特定的控制器方法来处理它们(如果您关心)或只是使用robots.txt文件指示机器人。即使你把所有事情都保持原样,从安全和搜索引擎优化的角度来看也不会有任何问题(如果GET和{{1}收到405,则大多数机器人会使用HEAD })。

做什么是对的?如果您在意,我会处理它们返回HTTP状态405(不允许)。有人还建议HTTP状态501(未实现)可能是正确/更好的响应。

MVC 正确为不受支持的OPTIONS返回方法不允许,并且它还会填充响应中的(必填)Request Method字段(在您的case Allow),其行为等同于此代码:

Allow: GET,POST

如果您不使用ASP.NET MVC 5,则不需要[ActionName("LogIn")] [HttpOptions, HttpHead] public ActionResult LogInForUnsupportedHttpMethods() { return new HttpStatusCodeResult(HttpStatusCode.MethodNotAllowed); } 枚举,您必须手动指定返回代码:HttpStatusCode

但是,如果不支持new HttpStatusCodeResult(405),并非所有机器人/蜘蛛/服务都正确切换到GET(值得注意的例子是downforeveryoneorjustme.com),那么您可能还想要返回您的页面对于HEAD(并保留HEAD的默认行为):

OPTIONS

优化:如果您正在运行流量非常高的网站,则会定期向许多人 // This method isn't required unless you want to return a different // HTTP status code or to perform some special operation. [HttpOptions, ActionName("LogIn")] public ActionResult LogInForUnsupportedHttpMethods() { return new HttpStatusCodeResult(HttpStatusCode.MethodNotAllowed); } [HttpGet, HttpHead] public ActionResult LogIn() {/* ... */ } [HttpPost] public ActionResult LogIn(LogInModel model) {/* ... */ } 请求他们(以可衡量的方式)会影响您的网站性能,然后您可能决定返回页面的精简版HEAD请求(可能没有太多的服务器端处理和可能未使用的客户端内容,如CSS和脚本)。< / p>