.htaccess - 将nonwww重写为www; php到html; http到https

时间:2014-03-22 20:52:47

标签: apache .htaccess mod-rewrite

我正在尝试从几个小时到以下: - .www请求应重写为非www - php应该重写为html - http应该重写为https - 所有重定向代码为301

我正在使用以下.htaccess文件:

RewriteEngine on

# www to non www
RewriteCond %{HTTP_HOST} ^www\.mydomain\.com [NC]
RewriteRule (.*) http://mydomain.com/$1 [R=301] 

# php to html
RewriteRule ^(.*).html$ $1.php 
RewriteCond %{THE_REQUEST} \ /(.+)\.php
RewriteRule ^ /%1.html [R=301]


# http to https
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301]

但它不起作用。如果我删除http到https规则,我会得到以下结果:

带有.html的www重定向到非www,最后带有.php:

 :~$ curl -I http://www.mydomain.com/index.html
 Location: http://mydomain.com/index.**php**
带有.php的www重定向到www.html的www:

 :~$ curl -I http://www.mydomain.com/index.php
 Location: http://**www.**mydomain.com/index.html

非www与PHP工作,它被重定向到HTML,这是正确的:

 :~$ curl -I http://mydomain.com/index.php
 Location: http://mydomain.com/index.html

使用http到https规则,一切都搞砸了,因为域被双重插入:

 :~$ curl -I http://mydomain.com:81/index.php
 Location: https://mydomain.com:81/http://mydomain.com:81/index.html

我理解http到https重写的问题,url是双重插入的,因为它已经被重写了。但解决这些问题的正确htaccess规则是什么?

1 个答案:

答案 0 :(得分:1)

你可以尝试一下。如果我清楚你想要什么,我相信这将满足你的要求。

# www to non www and HTTPS if not
RewriteCond %{HTTP_HOST} ^www\.mydomain\.com [NC,OR]
RewriteCond %{HTTPS} !^on
RewriteRule (.*) https://mydomain.com/$1 [R=301,L]

#rewrite files to html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)\.html$ /$1.php [L]