这似乎很基本,关于.htaccess的在线问题很多,但是经过两天的研究,我仍然无法按照自己的方式进行我的工作。
我想要的是:
对所有请求强制使用https
始终使用网址的“ www”版本。
在多个域上工作(但不能将全部重定向到主域)。我所有的域都指向同一文件夹(因此它们将使用相同的代码库),并且其根目录中是.htaccess文件。
删除网址的“ index.php”部分,使其变得人性化和SEO友好。
这是我到目前为止所拥有的:
从CodeIgniter的基本.htaccess代码开始,如userguide所示:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1
最初,最后一行具有[L]
标志,但是我省略了它,因此它将继续遵循以下规则。
(我是否假设它采用了先前的RewriteRule中的url输出并对其执行以下匹配?)
# for non www urls, add www and force https:
RewriteCond %{HTTP_HOST}(.*) !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R,L]
# for www urls, just force https:
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]
上面的代码实现了我上面列出的任务1-3,但是index.php仍然显示在地址栏中。 如何删除它?
答案 0 :(得分:0)
好吧,我(部分)放弃了.htaccess,并以另一种方式解决了我的问题:
我现在正在使用CodeIgniter钩子来处理强制https,而让htaccess只处理强制www和删除index.php
因此,我删除了最后一行(RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]
),并向我的应用程序添加了一个ssl钩子,现在一切正常。
如果有人感兴趣,钩子函数是这样的:
function force_ssl()
{
if ($_SERVER['HTTP_HOST']!='localhost' && $_SERVER['HTTP_HOST']!='10.0.2.2')
{
$CI =& get_instance();
$CI->config->config['base_url'] = str_replace('http://', 'https://', $CI->config->config['base_url']);
if ($_SERVER['SERVER_PORT'] != 443) redirect($CI->uri->uri_string());
}
}