.htaccess 为什么heroku会重定向;文件夹式;通过301到http的请求?
我有一个在heroku上运行的spa,我想让它在强制https上运行。我使用PHP堆栈进行一些基本的身份验证,没有什么特别的,只有一个index.PHP。虽然这应该很容易,但我有一个奇怪的重定向: 例如,当我访问/appStart时,我会在日志中看到:.htaccess 为什么heroku会重定向;文件夹式;通过301到http的请求?,.htaccess,heroku,redirect,.htaccess,Heroku,Redirect,我有一个在heroku上运行的spa,我想让它在强制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 (Ma
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以追加尾随斜杠。例如,/appStart/
如果appStart
是一个物理目录,则应该请求/appStart/
(带尾随斜杠)
更新:请确保:目录删除
将解决我的问题,对吗
(我假设您的.htaccess
文件位于/appStart/.htaccess
?)
事实上要比这复杂一点。如果目录上没有尾随斜杠,则将无法处理.htaccess
中的mod_rewrite指令,并且前端控制器(内部重写为index.php
)将失败。其他问题,如DirectoryIndex
(mod_dir)也将失败-尽管您似乎并不依赖于此(您使用的是mod_rewrite)
最终结果是,您可能会得到403禁止响应(除非您启用了mod_autoindex-在这种情况下,您将得到一个自动生成的目录列表,尽管存在DirectoryIndex
文档!请参阅Apache文档中的。)
简而言之,Apache需要尾部斜杠
如果使用directorysash Off
禁用尾部斜杠的自动追加,则需要自己手动追加此尾部斜杠以避免这些问题。您需要在parent/root.htaccess
文件中执行此操作,而不是/appStart/.htaccess
例如。。。将现有的/appStart/.htaccess
文件移动到根/.htaccess
文件,包括指令slash Off
指令,并将最后一个RewriteRule
指令更改为:
RewriteRule ^appStart appStart/index.php [L]
但是,这并不一定能完全解决问题(取决于应用程序的结构),因为应用程序中的任何相对URL路径(到静态资源等)现在都是相对于文档根目录的,而不是像以前那样相对于
/appStart/
子目录的。这是一个客户端URL问题,只能通过“修复”客户端URL来解决。这可能不是Heroku,而是index.php
中的某个内容。index.php包含一些cookie检查(身份验证),然后包含一次(“index.html”);。就这样,没有重写/重定向。事实上,出于测试目的,我删除了php,并将上一个重写规则更改为index.html
——同样的行为!可以肯定的是:DirectorySlash Off将解决我的问题,对吗?不幸的是,它可能没有那么容易。我已经更新了我的答案。