用于 http 到 https 重定向的 htaccess 文件不起作用
htaccess file for http to https redirection does not work
我有一个问题,不明白为什么它不起作用...
- 我在 www.example.com/FOLDER
有一个网站
- 我尝试创建一个 http 到 https 的 htaccess 文件(当然我的服务器支持它)
- 所以我在 FOLDER 子目录中创建了一个 .htaccess 文件:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule FOLDER/(.*) https://www.example.com/FOLDER/ [R,L]
但它不起作用:如果我浏览到 http://www.example.com/FOLDER/index.php,它仍保留在 http 中,不会重定向到 https://...
我也试过了
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} FOLDER
RewriteRule FOLDER/(.*) https://www.example.com/FOLDER/ [R,L]
但还是没有运气...
如果我尝试:
RewriteCond %{HTTPS} off
RewriteRule (.*) https://www.example.com/FOLDER/ [R,L]
服务器回复错误:重定向太多...(我不明白,因为重定向应该在 https 中进行,所以条件不应第二次应用...)
如果我在根目录的 .htaccess 文件中执行所有这些操作,我仍然会遇到同样的问题...
但是,如果我这样做
http://www.example.com/FOLDER/SUBFOLDER
然后它会工作并将我发送到
https://www.example.com/FOLDER/SUBFOLDER
我错过了什么??
请求的额外数据:
服务器:
[PHP_INI_SCAN_DIR] => :/web/htdocs/www.example.com/php.d
[PORTID] => 10018
[DOMAINNAME] => www.example.com
[APACHE_MAX_SPARE] => 3
[WORKERS] => 35
[APACHE_THREADS] => 5
[PM_MAX_CHILDREN] => 40
[SUPERVISOR_GROUP_NAME] => php-fpm
[PATH] => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[PM_MAX_REQUESTS] => 1000
[HOME] => /root
[PM_PROCESS_IDLE_TIMEOUT] => 60s
[LANG] => en_US.utf8
[TERM] => xterm
[SUPERVISOR_SERVER_URL] => unix:///var/run/supervisor/supervisor.sock
[APACHE_SERVER_LIMITS] => 8
[SHLVL] => 0
[SUPERVISOR_ENABLED] => 1
[GROUPNAME] => 18729849
[PM] => dynamic
[USERNAME] => 18729849
[APACHE_MIN_SPARE] => 1
[SUPERVISOR_PROCESS_NAME] => php-fpm
[MAINDOMAINNAME] => www.example.com
[APACHE_MAX_WORKERS] => 40
[HOSTNAME] => webxc250s02.ad.xxxx.xx
[APACHE_START_SERVERS] => 1
[PWD] => /
[SCRIPT_NAME] => /ser.php
[REQUEST_URI] => /ser.php
[QUERY_STRING] =>
[REQUEST_METHOD] => GET
[SERVER_PROTOCOL] => HTTP/1.0
[GATEWAY_INTERFACE] => CGI/1.1
[REMOTE_PORT] => 10410
[SCRIPT_FILENAME] => /web/htdocs/www.example.com/home/ser.php
[SERVER_ADMIN] => postmaster@www.example.com
[CONTEXT_DOCUMENT_ROOT] => /web/htdocs/www.example.com/home/
[CONTEXT_PREFIX] =>
[REQUEST_SCHEME] => http
[DOCUMENT_ROOT] => /web/htdocs/www.example.com/home/
[REMOTE_ADDR] => nnn
[SERVER_PORT] => 80
[SERVER_ADDR] => nnn
[SERVER_NAME] => www.example.com
[SERVER_SOFTWARE] => Apache
[SERVER_SIGNATURE] =>
[HTTP_ACCEPT_LANGUAGE] => it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6,pt;q=0.5,fr;q=0.4,de;q=0.3,es;q=0.2
[HTTP_ACCEPT_ENCODING] => gzip, deflate, br
[HTTP_SEC_CH_UA_PLATFORM] => "Windows"
[HTTP_SEC_CH_UA_MOBILE] => ?0
[HTTP_SEC_CH_UA] => " Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"
[HTTP_SEC_FETCH_DEST] => document
[HTTP_SEC_FETCH_USER] => ?1
[HTTP_SEC_FETCH_MODE] => navigate
[HTTP_SEC_FETCH_SITE] => none
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
[HTTP_UPGRADE_INSECURE_REQUESTS] => 1
[HTTP_CONNECTION] => close
[HTTP_X_FORWARDED_PROTO] => https
[HTTP_X_FORWARDED_PORT] => 443
[HTTP_X_REAL_IP] => nnn
[HTTP_HOST] => www.example.com
[proxy-nokeepalive] => 1
[HTTPS] => on
[UNIQUE_ID] => xxx
[FCGI_ROLE] => RESPONDER
[PHP_SELF] => /ser.php
[REQUEST_TIME_FLOAT] => 1638222363.152
[REQUEST_TIME] => 1638222363
.htaccess 在根目录中
Options +Indexes
ErrorDocument 401 default
RewriteEngine On
RewriteRule ^$ https://www.example.com/index.php [QSA,L,R=301]
RewriteCond %{REQUEST_URI} ^/admin [NC]
RewriteRule (.*) [QSA,L]
RewriteCond %{REQUEST_URI} !^admin [NC]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.*) [QSA,L]
#RewriteRule ^(.+) - [PT,L]
RewriteCond %{REQUEST_URI} nologin
RewriteRule ^(.*)/nologin$ https://www.example.com/?nologin [QSA,L,R]
RewriteCond %{REQUEST_URI} login
RewriteRule ^(.*)/login$ https://www.example.com/?login [QSA,L,R]
RewriteRule ^(.*)\.png$ - [L]
RewriteRule ^(.*)\.jpg$ - [L]
RewriteRule ^(.*)\.gif$ - [L]
RewriteRule ^(.*)\.ico$ - [L]
RewriteRule ^(.*)\.ico$ - [L]
RewriteRule ^(.*)\.txt$ - [L]
RewriteRule ^(.*)\.xml$ - [L]
RewriteRule ^(.*)\.php$ - [L]
RewriteRule ^home$ my.php?layout= [QSA,L]
RewriteRule ^home/$ my.php?layout= [QSA,L]
RewriteRule ^home/([^/]*)$ my.php?layout= [QSA,L]
RewriteRule ^home/([^/]*/)$ my.php?layout= [QSA,L]
RewriteRule ^home/([^/]*)/(.*)$ my.php?layout=&page= [QSA,L]
RewriteRule ^([^/]*)$ my.php?e3= [QSA,L]
RewriteRule ^([^/]*)/$ my.php?e3= [QSA,L]
RewriteRule ^([^/]*)/([^/]*)$ my.php?e3=&layout= [QSA,L]
RewriteRule ^([^/]*)/([^/]*)/$ my.php?e3=&layout= [QSA,L]
RewriteRule ^([^/]*)/([^/]*)/(.*)$ my.php?e3=&layout=&page= [QSA,L]
RewriteRule ^(.*) we.php?layout=default [L]
ErrorDocument 404 /errors/404.html
[HTTP_X_FORWARDED_PROTO] => https
[HTTP_X_FORWARDED_PORT] => 443
[HTTP_X_REAL_IP] => nnn
:
[HTTPS] => on
您显然使用了某种代理服务器。这里不清楚 HTTPS
是 Apache 服务器变量还是系统设置的同名环境变量。我假设是后者,因为你在 Apache 中针对 %{HTTPS} off
进行测试时得到了 redirect-loop。
如果您只想将此应用到 /FOLDER/
子目录,请创建一个 /FOLDER/.htaccess
文件并尝试以下操作:
# /FOLDER/.htaccess
RewriteEngine On
# Redirect HTTP to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R,L]
这将测试由中间代理设置的 X-Forwarded-Proto
HTTP 请求 header。如果您在代理服务器后面(似乎是这种情况),则应 仅 使用此规则,否则此 header 可能会被伪造。
这最终应该是一个 301(永久)重定向,所以一旦您确认它按预期工作,请将 R
更改为 R=301
。
请注意 mod_rewrite 指令不会被继承(默认情况下),因此不会处理根 .htaccess
文件中的 mod_rewrite 指令。
我有一个问题,不明白为什么它不起作用...
- 我在 www.example.com/FOLDER 有一个网站
- 我尝试创建一个 http 到 https 的 htaccess 文件(当然我的服务器支持它)
- 所以我在 FOLDER 子目录中创建了一个 .htaccess 文件:
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule FOLDER/(.*) https://www.example.com/FOLDER/ [R,L]
但它不起作用:如果我浏览到 http://www.example.com/FOLDER/index.php,它仍保留在 http 中,不会重定向到 https://...
我也试过了
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} FOLDER
RewriteRule FOLDER/(.*) https://www.example.com/FOLDER/ [R,L]
但还是没有运气...
如果我尝试:
RewriteCond %{HTTPS} off
RewriteRule (.*) https://www.example.com/FOLDER/ [R,L]
服务器回复错误:重定向太多...(我不明白,因为重定向应该在 https 中进行,所以条件不应第二次应用...)
如果我在根目录的 .htaccess 文件中执行所有这些操作,我仍然会遇到同样的问题...
但是,如果我这样做
http://www.example.com/FOLDER/SUBFOLDER
然后它会工作并将我发送到
https://www.example.com/FOLDER/SUBFOLDER
我错过了什么??
请求的额外数据:
服务器:
[PHP_INI_SCAN_DIR] => :/web/htdocs/www.example.com/php.d
[PORTID] => 10018
[DOMAINNAME] => www.example.com
[APACHE_MAX_SPARE] => 3
[WORKERS] => 35
[APACHE_THREADS] => 5
[PM_MAX_CHILDREN] => 40
[SUPERVISOR_GROUP_NAME] => php-fpm
[PATH] => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[PM_MAX_REQUESTS] => 1000
[HOME] => /root
[PM_PROCESS_IDLE_TIMEOUT] => 60s
[LANG] => en_US.utf8
[TERM] => xterm
[SUPERVISOR_SERVER_URL] => unix:///var/run/supervisor/supervisor.sock
[APACHE_SERVER_LIMITS] => 8
[SHLVL] => 0
[SUPERVISOR_ENABLED] => 1
[GROUPNAME] => 18729849
[PM] => dynamic
[USERNAME] => 18729849
[APACHE_MIN_SPARE] => 1
[SUPERVISOR_PROCESS_NAME] => php-fpm
[MAINDOMAINNAME] => www.example.com
[APACHE_MAX_WORKERS] => 40
[HOSTNAME] => webxc250s02.ad.xxxx.xx
[APACHE_START_SERVERS] => 1
[PWD] => /
[SCRIPT_NAME] => /ser.php
[REQUEST_URI] => /ser.php
[QUERY_STRING] =>
[REQUEST_METHOD] => GET
[SERVER_PROTOCOL] => HTTP/1.0
[GATEWAY_INTERFACE] => CGI/1.1
[REMOTE_PORT] => 10410
[SCRIPT_FILENAME] => /web/htdocs/www.example.com/home/ser.php
[SERVER_ADMIN] => postmaster@www.example.com
[CONTEXT_DOCUMENT_ROOT] => /web/htdocs/www.example.com/home/
[CONTEXT_PREFIX] =>
[REQUEST_SCHEME] => http
[DOCUMENT_ROOT] => /web/htdocs/www.example.com/home/
[REMOTE_ADDR] => nnn
[SERVER_PORT] => 80
[SERVER_ADDR] => nnn
[SERVER_NAME] => www.example.com
[SERVER_SOFTWARE] => Apache
[SERVER_SIGNATURE] =>
[HTTP_ACCEPT_LANGUAGE] => it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6,pt;q=0.5,fr;q=0.4,de;q=0.3,es;q=0.2
[HTTP_ACCEPT_ENCODING] => gzip, deflate, br
[HTTP_SEC_CH_UA_PLATFORM] => "Windows"
[HTTP_SEC_CH_UA_MOBILE] => ?0
[HTTP_SEC_CH_UA] => " Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"
[HTTP_SEC_FETCH_DEST] => document
[HTTP_SEC_FETCH_USER] => ?1
[HTTP_SEC_FETCH_MODE] => navigate
[HTTP_SEC_FETCH_SITE] => none
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
[HTTP_UPGRADE_INSECURE_REQUESTS] => 1
[HTTP_CONNECTION] => close
[HTTP_X_FORWARDED_PROTO] => https
[HTTP_X_FORWARDED_PORT] => 443
[HTTP_X_REAL_IP] => nnn
[HTTP_HOST] => www.example.com
[proxy-nokeepalive] => 1
[HTTPS] => on
[UNIQUE_ID] => xxx
[FCGI_ROLE] => RESPONDER
[PHP_SELF] => /ser.php
[REQUEST_TIME_FLOAT] => 1638222363.152
[REQUEST_TIME] => 1638222363
.htaccess 在根目录中
Options +Indexes
ErrorDocument 401 default
RewriteEngine On
RewriteRule ^$ https://www.example.com/index.php [QSA,L,R=301]
RewriteCond %{REQUEST_URI} ^/admin [NC]
RewriteRule (.*) [QSA,L]
RewriteCond %{REQUEST_URI} !^admin [NC]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.*) [QSA,L]
#RewriteRule ^(.+) - [PT,L]
RewriteCond %{REQUEST_URI} nologin
RewriteRule ^(.*)/nologin$ https://www.example.com/?nologin [QSA,L,R]
RewriteCond %{REQUEST_URI} login
RewriteRule ^(.*)/login$ https://www.example.com/?login [QSA,L,R]
RewriteRule ^(.*)\.png$ - [L]
RewriteRule ^(.*)\.jpg$ - [L]
RewriteRule ^(.*)\.gif$ - [L]
RewriteRule ^(.*)\.ico$ - [L]
RewriteRule ^(.*)\.ico$ - [L]
RewriteRule ^(.*)\.txt$ - [L]
RewriteRule ^(.*)\.xml$ - [L]
RewriteRule ^(.*)\.php$ - [L]
RewriteRule ^home$ my.php?layout= [QSA,L]
RewriteRule ^home/$ my.php?layout= [QSA,L]
RewriteRule ^home/([^/]*)$ my.php?layout= [QSA,L]
RewriteRule ^home/([^/]*/)$ my.php?layout= [QSA,L]
RewriteRule ^home/([^/]*)/(.*)$ my.php?layout=&page= [QSA,L]
RewriteRule ^([^/]*)$ my.php?e3= [QSA,L]
RewriteRule ^([^/]*)/$ my.php?e3= [QSA,L]
RewriteRule ^([^/]*)/([^/]*)$ my.php?e3=&layout= [QSA,L]
RewriteRule ^([^/]*)/([^/]*)/$ my.php?e3=&layout= [QSA,L]
RewriteRule ^([^/]*)/([^/]*)/(.*)$ my.php?e3=&layout=&page= [QSA,L]
RewriteRule ^(.*) we.php?layout=default [L]
ErrorDocument 404 /errors/404.html
[HTTP_X_FORWARDED_PROTO] => https [HTTP_X_FORWARDED_PORT] => 443 [HTTP_X_REAL_IP] => nnn : [HTTPS] => on
您显然使用了某种代理服务器。这里不清楚 HTTPS
是 Apache 服务器变量还是系统设置的同名环境变量。我假设是后者,因为你在 Apache 中针对 %{HTTPS} off
进行测试时得到了 redirect-loop。
如果您只想将此应用到 /FOLDER/
子目录,请创建一个 /FOLDER/.htaccess
文件并尝试以下操作:
# /FOLDER/.htaccess
RewriteEngine On
# Redirect HTTP to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R,L]
这将测试由中间代理设置的 X-Forwarded-Proto
HTTP 请求 header。如果您在代理服务器后面(似乎是这种情况),则应 仅 使用此规则,否则此 header 可能会被伪造。
这最终应该是一个 301(永久)重定向,所以一旦您确认它按预期工作,请将 R
更改为 R=301
。
请注意 mod_rewrite 指令不会被继承(默认情况下),因此不会处理根 .htaccess
文件中的 mod_rewrite 指令。