我有一个非常奇怪的问题。我刚刚将应用程序部署到生产中。我有两种登录操作方法:
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的形式出现?我不知道用户是如何尝试连接到应用程序的。
答案 0 :(得分:0)
为了确保您还应该检查使用该请求记录的用户代理字符串(如果可用),但我敢打赌 bot 检查您的主页(可能重定向到登录页)。
另见googlebot head request。我不鼓励用户代理字符串过滤,除非你想了解这个主题(并且无论如何坏机器人可能会伪造搜索引擎蜘蛛的用户代理字符串)。
他们通常使用正常 GET请求,但有些机器人(尝试优化带宽使用?)首先尝试使用HEAD
和OPTIONS
。
您有两种选择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>