如何删除WWW前缀,为codeigniter mod_rewrite添加https和重写?

时间:2013-05-30 16:02:31

标签: apache codeigniter mod-rewrite

我在尝试在Apache中设置虚拟主机以使用codeigniter时遇到了麻烦。

我想: - 删除www(如果存在) - 重定向到https - 重写请求标头以重定向到codeigniter解析

到目前为止,这是我的代码:

           RewriteEngine on
           RewriteBase /
           RewriteCond %{HTTPS} off
           RewriteRule (.*) https://abc.com%{REQUEST_URI} [L]
           RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
           RewriteRule ^ http://%1%{REQUEST_URI} [L]
           RewriteCond %{REQUEST_FILENAME} !-f
           RewriteCond %{REQUEST_FILENAME} !-d
           RewriteRule ^(.*)$ https://abc.com/index.php?q=$1 [L,QSA]

但它根本不起作用;我在这做错了什么?

2 个答案:

答案 0 :(得分:2)

如果你采取三个单独的部分,一次只做一个,你会发现只有一个不起作用吗?

强制https

RewriteCond %{HTTPS} off
RewriteRule (.*) https://abc.com%{REQUEST_URI} [L]

首先,检查“off”是否适合您的安装。您可以更好地检查服务器用于https的端口号

RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://abc.com/$1 [L]

强制abc.com而不是www.abc.com

RewriteCond %{HTTP_HOST}  ^www\.(.+) [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [L]

由于您已经在此.htaccess中对您的域名进行了硬编码,因此您可以在此处使用RewriteRule而不是%1。现在,如果您要转换为上面的https,无论您是否已经使用https,这是否会将您发送回http?我也会用。而不是^,你真的想丢失URL的其余部分吗?

RewriteCond %{HTTP_HOST}  ^www\. [NC]
RewriteRule ^(.*)$ https://abc.com/$1 [L]

虚假文件或目录,翻转为固定URI

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ https://abc.com/index.php?q=$1 [L,QSA]

这会将任何现有的查询字符串附加到q =原始路径/文件。没有它,我认为q = original将缺少旧的查询字符串。

请注意,所有这些都应该产生302代码(等于[R = 302])。如果你想要301,你必须明确地给它([R = 301,L])。我不确定在什么情况下.htaccess中的多个R = 301会产生错误,因此您可能需要进行一些实验。

答案 1 :(得分:1)

也许这有效:

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} (?:www\.)?(.+)  [NC] 
RewriteRule ^(.*) https://%1/$1     [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  !index\.php [NC]
RewriteRule ^(.*) https://abc.com/index.php?q=$1 [R=301,L,QSA]