解释htaccess规则?

use*_*919 4 apache .htaccess mod-rewrite

我通过搜索,复制和粘贴等过去一小时制作了这个.htaccess文件.

它确实有用,我想要它.

但是我不明白.

有人可以一步一步地把它放在外行人的条件下发生的事情.

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?(.*)$ /$1.php [L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php
RewriteRule ^/?(.*)\.php$ /$1 [L,R=301]

RewriteCond %{THE_REQUEST} ^.*/index
RewriteRule ^(.*)index.php$ /$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

如果有任何提示,请将它们扔进去.

Mic*_*ski 5

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)

^www\.example\.com$^$意味着这是完整的字符串HTTP_HOST,之前或之后都没有.因此,如果与请求一起传递的域名www.example.com 完全匹配,则整个URI (.*)将重定向到example.com,从而www.从前端剥离.


RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?(.*)$ /$1.php [L]
Run Code Online (Sandbox Code Playgroud)

一个-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]
Run Code Online (Sandbox Code Playgroud)

THE_REQUEST包含GET/POST浏览器最初发送的完整请求,如GET /index.php.所以这里匹配的内容类似于前一个块.

  • ^[A-Z]{3,9}首先匹配动词GETPOST等,但不捕获它以供重复使用
  • /([^\ ]+)随后捕捉跟一切/,并到下一个空格,就像indexGET /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]
Run Code Online (Sandbox Code Playgroud)

这个匹配/index原始请求中包含的任何内容,但它不必位于URI的开头.换句话说,/directory/index会匹配,就像那样/directory/subdir/index.php.无论它匹配什么,它都会被重定向到索引部分之前的任何内容.让我们分解一下:

  • ^(.*) 匹配开头的任何内容 $1
  • index.php ..来自上面匹配的任何东西

然后将其重定向到$1组件,因此,/directory/subdir/index.php如果浏览器直接请求的URL 将被重定向到指向更干净的URL:/directory/subdir/没有index.php出现在地址栏中.