![IIS 不区分大小写的虚拟目录(应用程序)问题](https://linux22.com/image/705610/IIS%20%E4%B8%8D%E5%8C%BA%E5%88%86%E5%A4%A7%E5%B0%8F%E5%86%99%E7%9A%84%E8%99%9A%E6%8B%9F%E7%9B%AE%E5%BD%95%EF%BC%88%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%EF%BC%89%E9%97%AE%E9%A2%98.png)
我在 IIS 中有一个应用程序,其 URL 是“http://本地主机/MAIN",请注意大写的虚拟目录。
当我尝试使用小写应用程序/虚拟目录名称访问此 url 时,例如“http://本地主机/main“然后应用程序将网址变成”http://localhost/MAIN/Account/Login?ReturnUrl=%2fmain“请注意“%2fmain”。执行登录后,我被重定向回登录页面/路由。
我认为 IIS 应该为小写的虚拟目录名称返回 404。
有人可以解释一下这个问题吗?
答案1
有同样的问题
在位于 vendor\symfony\http-foundation\Request.php 的函数 getUrlencodedPrefix 中将 strpos 更改为 stripos。
我们在使用 fast-cgi 访问 IIS 上的 laravel 应用程序时遇到了问题。
应用程序网址http://服务器/myApp指向应用程序公共文件夹,90% 的时间它都能正常工作,但不知何故,在几天内它突然停止工作,并出现路由错误 [在 RouteCollection.php(第 179 行)]。唯一的方法是通过相同的 URL 但小写“A”重新获得访问权限http://服务器/myapp几天后它又变回大写“A”。
大约 2 天前,问题变得更加严重,它开始几乎每小时切换一次。
我们已经将问题追溯到 vendor\symfony\http-foundation\Request.php 第 2043 行 [将 strpos 更改为 stripos] 解决了该问题。
根本原因似乎是使用 _SERVER['SCRIPT_NAME'] 变量处理 fast-cgi。当应用程序池回收 php-cgi.exe 进程时,对该进程的第一个请求会将此变量设置为虚拟文件夹的区分大小写部分。从那时起,matchAgainstRoutes(vendor\laravel\framework\src\Illuminate\Routing\RouteCollection.php)将失败,因为大小写不匹配。
我正在寻找一个长期解决方案,因为 Symphony Core 或 Laravel 的任何更新都很可能将此 FIX 改回原样。我希望这篇文章能有所帮助。