背景:网站(example.com),dns通过cloudflare pro计划设置,这提供了"灵活的ssl"(在这里阅读),这意味着ssl只存在于客户端和cloudflare之间,而不是cloudflare和服务器之间,因此不需要专用的ip和不需要在服务器上进行特殊设置.服务器设置为不使用ssl(只是一个通用网站),但是cloudflare灵活的ssl正在处理ssl方面.
语言:PHP(codeignighter,但这并不重要)
目标:浏览域"exmple.com/ "或"http:// exmple.com/ "时,生成变量"http:// example.com",并在浏览"https:// example.com"时/*"生成变量"https:// example.com".
什么应该工作(但不是):
$root = '';
if( isset($_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] != 'off' )
{
//it doesnt reach here...
$root .= 'https://';
}
else
{
$root .= 'http://';
}
$root .= "".$_SERVER['HTTP_HOST'];
$root .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
Run Code Online (Sandbox Code Playgroud)
我总是可以做到:"// example.com",但这对我来说并没有真正解决问题.思考?我应该做一些字符串比较来确定https-ness吗?
我确定原因是当请求到达服务器(https或http)时,它来自端口80并且它不会被识别为ssl,因此未定义$ _SERVER ['HTTPS'].我可以在服务器和cloudflare之间设置一个自定义的ssl,但如果我可以使用一些正则表达式并以某种方式比较网址,那么会更好(更省力).
我还想知道可能存在的问题和漏洞.
谢谢 :)
我在使用自定义(有点奇怪)的htaccess文件夹映射时遇到了codeignighter的问题.但是,它应该在技术上有效,但事实并非如此.有人能帮我吗?
场景1(工作正常):
文件夹结构和密钥文件
/ is the website root
/.htaccess
/api/ <this is the CodeIgniter Root, with index.php and default CI .htaccess>
Run Code Online (Sandbox Code Playgroud)
/.htaccess:
RewriteEngine On
RewriteRule ^api/(.*)$ /api/$1 [L]
Run Code Online (Sandbox Code Playgroud)
例如,访问mydomain.com/api/admin/会让我进入我的admin-controller/index操作并加载视图.
对于$ _REQUEST,index.php上的var_dump显示
array (size=1)
'admin/' => string '' (length=0)
Run Code Online (Sandbox Code Playgroud)
场景2(不起作用):
文件夹结构和密钥文件
/.htaccess
/current/.htaccess
/current/api/ <this is the CodeIgniter Root, with index.php and default CI .htaccess, this is the same folder/files/htaccess as above scenario>
Run Code Online (Sandbox Code Playgroud)
/.htaccess:
RewriteEngine On
RewriteRule ^(.*)$ /current/$1 [L]
Run Code Online (Sandbox Code Playgroud)
/current/.htaccess:
RewriteEngine On
RewriteRule ^api/(.*)$ /api/$1 [L]
Run Code Online (Sandbox Code Playgroud)
例如,访问mydomain.com/api/admin/可以访问Codeigniter 404页面/视图.
对于$ _REQUEST,index.php上的var_dump显示(与场景1相同) …