RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
^www\.example\.com$
锚点^$
意味着这是完整的字符串 in HTTP_HOST
,之前或之后都没有。因此,如果与请求一起传递的域名www.example.com
完全匹配,则整个 URI(.*)
被重定向到,从而从前面example.com
剥离。www.
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?(.*)$ /$1.php [L]
用于测试第一个参数是否是实际存在的文件的-f
标志。在这种情况下,它通过在测试参数上添加扩展RewriteCond
来测试 的值REQUEST_FILENAME
,这将是作为 PHP 文件存在file
的 URI 的最后一部分 ( ) 。example.com/directory/file
.php
因此,如果file.php
实际存在,则对不存在的请求在file
这里被静默地重写到其对应的 PHP 文件中,并带有$1.php
. 所以如果/directory/notexists
没有对应的directory/notexists.php
文件,就不会被重写。
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php
RewriteRule ^/?(.*)\.php$ /$1 [L,R=301]
THE_REQUEST
GET/POST
包含浏览器最初发送的完整请求,例如GET /index.php
. 所以这里匹配的和上一个块类似。
^[A-Z]{3,9}
first 匹配动词GET
orPOST
等,但不捕获它以供重用
/([^\ ]+)
然后捕获所有后续/
和直到下一个空格的内容,例如index
in GET /index.php
。
- 字面上
\.php
匹配
好的,然后下面的内容RewriteRule
将index
捕获到%1
上述条件,并实际重定向浏览器以删除.php
扩展名,使浏览器的结束 URL 看起来像/index
.
换句话说,如果浏览器请求/directory/file.php
带有.php
扩展名,它会将用户重定向/directory/file
到剥离.php
.
RewriteCond %{THE_REQUEST} ^.*/index
RewriteRule ^(.*)index.php$ /$1 [R=301,L]
这个匹配/index
原始请求中包含的任何内容,但它不必位于 URI 的开头。换句话说,/directory/index
会匹配,就像/directory/subdir/index.php
. 无论它匹配什么,它都会被重定向到索引部分之前的任何内容。让我们分解一下:
^(.*)
匹配开始时出现的任何内容$1
index.php
.. 出现在上面匹配的任何内容之后
然后将其仅重定向到$1
组件,因此像/directory/subdir/index.php
浏览器直接请求的 URL 将被重定向以指向更清晰的 URL:/directory/subdir/
而不会index.php
出现在地址栏中。