首页 > 解决方案 > 为什么heroku通过301将“类似文件夹”的请求重定向到http?

问题描述

我有一个在 heroku 上运行的水疗中心,我想让它在强制 https 上运行。我正在使用 PHP 堆栈对其进行一些基本的身份验证,没有什么特别的,只有一个 index.php。认为这应该很容易,但我在那里有一个奇怪的重定向:例如,当我访问 /appStart 时,我在日志中得到了这个:

10.8.149.25 - - [13/Feb/2021:19:23:57 +0000] "GET /appStart HTTP/1.1" 301 248 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36

这是我的.htaccess:


RewriteEngine On

#Force SSL 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=302]

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_URI} !\.(png|css|js|json|txt|ico)$
RewriteCond %{REQUEST_URI} !_nuxt
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

我在 .htaccess 中将 https 重写切换为 302,以确保重定向不是来自我的规则,所以......这个 301 来自哪里???

标签: .htaccessherokuredirect

解决方案


如果appStart是物理目录并且您请求/appStart(没有尾部斜杠),那么 mod_dir (Apache) 将使用 301 重定向“修复”URL 以附加尾部斜杠。IE。/appStart/.

如果是物理目录,您应该请求/appStart/(带有斜杠) 。appStart

更新:只是为了确定:DirectorySlash Off会解决我的问题,对吧?

(我假设您的.htaccess文件位于/appStart/.htaccess?)

它实际上比这更复杂一些。如果目录上没有尾部斜杠,.htaccess则不会处理您的 mod_rewrite 指令,并且前端控制器(内部重写为index.php)将失败。(mod_dir) 之类的其他问题DirectoryIndex也将失败 - 尽管您似乎并不依赖于此(您正在使用 mod_rewrite 代替)。

最终结果是您可能会收到 403 Forbidden 响应(除非您启用了 mod_autoindex - 在这种情况下,您将获得自动生成的目录列表,尽管存在DirectoryIndex文档!请参阅DirectorySlash指令的安全警告在 Apache 文档中。)

简而言之,Apache 需要尾部斜杠。

如果您禁用尾随斜杠的自动附加,DirectorySlash Off那么您需要自己手动附加此尾随斜杠以避免这些问题。您需要在父/根.htaccess文件中执行此操作,而不是/appStart/.htaccess.

例如...现有/appStart/.htaccess文件移动到根/.htaccess文件,包含DirectorySlash Off指令并将最后一个RewriteRule指令更改为:

RewriteRule ^appStart appStart/index.php [L]

但是,这不一定完全解决问题(取决于您的应用程序的结构),因为您的应用程序中的任何相对 URL 路径(静态资源等)现在都相对于文档根目录,而不是/appStart/子目录,因为他们本来是以前的。这是一个客户端 URL 问题,只能通过“修复”客户端 URL 来解决。


推荐阅读