.htaccess - 为什么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 来自哪里???
解决方案
如果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 来解决。
推荐阅读
- openssl - 在不访问 PK 的情况下生成签名的 PKCS#7
- python - sort_values() 得到了一个意外的关键字参数“by”
- processing - 如何用某种颜色填充矩形并在处理控制台中打印字符串?
- windows - 一些链接是指本地主机,但主机文件很好
- android - 为小米米 a1 从源代码构建沿袭 15.1 时获取“无效参数名称”
- mysql - SQL select id where id is not in a entry with multiple id in another table
- android - 创建刷卡动画 Android Studio
- cmake - 将 FireGiant Appx 扩展与 cmake 一起使用
- json - 如何将 JSON 提取到表中
- php - 如何从json php获取数字键值