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_REQUESTGET/POST包含浏览器最初发送的完整请求,例如GET /index.php. 所以这里匹配的和上一个块类似。
^[A-Z]{3,9}first 匹配动词GETorPOST等,但不捕获它以供重用
/([^\ ]+)然后捕获所有后续/和直到下一个空格的内容,例如indexin 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出现在地址栏中。