我最近正在寻找一种方法来正确地确定协议,在该协议下,url请求被提供给服务器.
我看过parse_url()并通过$_SERVER超全局变量,发现了这个:
<?php
header('Content-Type: text/plain');
print_r($_SERVER);
?>
Run Code Online (Sandbox Code Playgroud)
输出:
[REQUEST_SCHEME] => http
但是,我无法在php.net或Google 上找到它.虽然,我能够找到这个问题.问题1:如果$_SERVER['REQUEST_SCHEME']没有记录,那么它可能不可靠,或者它可以被信任?
我VC9 PHP 5.4.14 TS在windows下用于开发.但我的生产是在ubuntu下.问题2:这个属性在ubuntu linux下也可用吗?
tox*_*lot 54
该REQUEST_SCHEME环境变量记录了在Apache的mod_rewrite的页面.但是,它直到Apache 2.4才可用.
我只有Apache 2.2所以我创建了一个环境变量.我将以下内容添加到.htaccess文件的顶部.
RewriteEngine on
# Set REQUEST_SCHEME (standard environment variable in Apache 2.4)
RewriteCond %{HTTPS} off
RewriteRule .* - [E=REQUEST_SCHEME:http]
RewriteCond %{HTTPS} on
RewriteRule .* - [E=REQUEST_SCHEME:https]
Run Code Online (Sandbox Code Playgroud)
现在我可以用了
%{ENV:REQUEST_SCHEME} 在其他重写条件和规则$_SERVER['REQUEST_SCHEME'] 在我的PHP代码中我无需在任何地方进行额外的杂乱条件检查,并且我的PHP代码是向前兼容的.当Apache升级时,我可以更改我的.htaccess文件.
我不知道你如何将它应用于Windows环境.对于分布式代码而言,这可能不是一个好的解决方案,但它可以很好地满足我的需求.
ald*_*ans 11
由于此变量在所有服务器版本中都不可用,因此仅对其进行可靠性测试.相反,您可以更改PHP代码以测试另外两个服务器环境变量,这也可以指示正在使用https,如下所示:
if ( (! empty($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https') ||
(! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ||
(! empty($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443') ) {
$server_request_scheme = 'https';
} else {
$server_request_scheme = 'http';
}
Run Code Online (Sandbox Code Playgroud)
正如toxalot所述,REQUEST_SCHEME是Apache Web服务器自2.4版以来的本机变量.Apache 2.2没有它(参见Apache 2.2服务器变量),而Microsoft IIs 8.5也没有它(参见IIS 8.5服务器变量).当然,如果服务器未设置变量,PHP将不会将其包含在其全局数组$ _SERVER中.
幸运的是,为了兼容基于REQUEST_SCHEME检查的代码,您可以在Apache 2.2中创建此变量,编辑所有主机配置文件(httpd.conf,ssl.conf,000-default.conf,vhosts.conf),添加以下行:
# FOR HOSTS LISTENING AT PORT 80
SetEnvIf Request_Protocol ^HTTP/ REQUEST_SCHEME=http
# FOR HOSTS LISTENING AT PORT 443
SetEnvIf Request_Protocol ^HTTP/ REQUEST_SCHEME=https
Run Code Online (Sandbox Code Playgroud)
上面的代码假定对每个协议使用一个虚拟主机的(在Apache的一种最佳实践-看到这和该).
| 归档时间: |
|
| 查看次数: |
41144 次 |
| 最近记录: |