Har*_*iec 10 .htaccess mod-rewrite https http http-status-code-401
好的,这是第7天未成功尝试找到答案为什么会出现401错误...
现在,根文件夹中的.htaccess只包含3个字符串(已简化),项目中没有更多.htaccess文件:
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Run Code Online (Sandbox Code Playgroud)
因此,它将所有请求重定向为https.它适用于任何URL,即使对于/ administration目录也是如此.
所以,
http://mydomain.com
Run Code Online (Sandbox Code Playgroud)
变
https://mydomain.com
Run Code Online (Sandbox Code Playgroud)
如果https://mydomain.com输入,则没有重定向.
http://mydomain.com/administration/index.php
Run Code Online (Sandbox Code Playgroud)
变
https://mydomain.com/administration/index.php
Run Code Online (Sandbox Code Playgroud)
如果https://mydomain.com/administration/index.php输入,则没有重定向.
这很清楚,问题如下.
我希望/管理目录受密码保护.我的共享主机控制面板允许保护目录而无需手动创建.htaccess和.htpasswd(您选择要保护的目录,创建用户名和密码,并自动创建.htaccess和.htpasswd).因此,.htaccess出现在/ administration文件夹中..htpasswd出现在其他地方,.htpasswd的路径是正确的,一切看起来都是正确的(它的工作方式与手动创建它的方式相同).因此,项目中有2个.htaccess文件,一个位于根目录中,另一个位于/ administration目录中(目录中的.htpasswd .htaccess知道它在哪里).
创建密码后,结果为:
你输入:
https://mydomain.com/administration/index.php
Run Code Online (Sandbox Code Playgroud)
然后它要求输入密码.如果输入正确,
https://mydomain.com/administration/index.php则会显示.
结果:完美无缺.
但是,如果你输入
http://mydomain.com/administration/index.php(是的,http,没有S)然后重定向到相同但是重定向到https页面而不是重定向到
https://mydomain.com/401.shtml (starts with httpS)
Run Code Online (Sandbox Code Playgroud)
原因不明,甚至不问密码.为什么?
我已就此问题联系了客户支持,他们确定问题出在.htaccess文件中,并且他们没有修复.htaccess文件(很明显,他们没有,我不介意).
为什么会这样?我是否忘记在.htaccess文件中放置一些标志或一些选项来更改默认设置?
PSCreating .htaccess和.htpasswd手动(不是从托管控制面板)文件夹/管理导致相同的401错误,如果不是https,但输入了http.
并且问题仅出现在/ administration目录的URL中.
谢谢.
Ger*_*ben 14
请尝试使用它.不是L和R标志.
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Run Code Online (Sandbox Code Playgroud)
还要先清除浏览器缓存,以删除旧的错误重定向.
如果这不起作用尝试使用此.
RewriteCond %{HTTPS} !on
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ ([^\ ]+)
RewriteRule ^ https://%{HTTP_HOST}%2 [L,R=301]
Run Code Online (Sandbox Code Playgroud)
我觉得写它有点不好,因为在我看来它看起来有点像黑客.
EDIT 似乎第二个选项修复了问题.所以这里解释为什么它的工作原理.
认证模块在重写模块之前执行.由于首次请求页面时未发送用户名和密码,因此身份验证模块会在内部"重写"请求URL到401页面的URL.在此mod_rewrite到来之后,%{THE_REQUEST}现在包含401.shtml而不是原始url.因此,生成的重定向包含401.shtml,而不是您想要的URL.
获取原始(不是"重写")网址,您需要从%{THE_REQUEST}中提取它.THE_REQUEST就在形式中[requestmethod] [url] HTTP[versionnumber].RewriteCond只提取中间部分([url]).
为了完整性,我将[L,R=301]标志添加到第二个解决方案.
| 归档时间: |
|
| 查看次数: |
8733 次 |
| 最近记录: |