第1步。
更改所有链接以.html
从链接中删除。确保您已Multiviews
关闭:
Options -Multiviews
第2步。
当主机名中缺少 www 时,您需要规则来重定向浏览器:
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
步骤 3。
当请求带有或已删除扩展名的 URL 时,您需要规则来重定向浏览器:.html
.php
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /([^\ ]+)\.(php|html?)
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ /%2 [L,R=301]
第4步。
如果请求实际上是针对 php 或 html 文件,则需要规则来内部重写URI:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ /$1.php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.htm -f
RewriteRule ^(.*)$ /$1.htm [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ /$1.html [L]
.htaccess
所以总而言之,你应该在你的 htaccess 中有这些规则(放弃你可能已经尝试解决这个问题的任何规则):
# Make sure Multiviews is off
Options -Multiviews
# turn on rewrite engine
RewriteEngine On
# Redirect requests that are missing www and not a subdomain
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
# Redirect if requests is for a .htm, .html, or .php
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /([^\ ]+)\.(php|html?)
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ /%2 [L,R=301]
# rewrite to the proper extension if such a file exists
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ /$1.php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.htm -f
RewriteRule ^(.*)$ /$1.htm [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ /$1.html [L]
总而言之:
- 如果浏览器 URL 地址栏显示:http ://example.com/index.html它将被重定向到http://www.example.com/index
- 如果浏览器 URL 地址栏显示:http ://www.example.com/index它将显示http://www.example.com/index.html的内容(或者
index.php
如果存在)。地址栏保持不变。
- 如果浏览器 URL 地址栏显示:http://foo.example.com/images/image.png您将在
/images/image.png
. 地址栏保持不变。
- 如果浏览器 URL 地址栏显示:http: //foo.example.com/path/foo/bar.php它将被重定向到http://foo.example.com/path/foo/bar
- 如果浏览器 URL 地址栏显示:http://foo.example.com/path/foo/bar它将显示在http://foo.example.com/path/foo/bar.php的内容。地址栏保持不变。