我正在尝试从几个小时到以下: - .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规则是什么?
答案 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]