我在过去一小时内通过搜索,复制和粘贴等方式制作了这个.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]
如果有任何提示,请将它们扔进去。
答案 0 :(得分:5)
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
^www\.example\.com$
锚点^$
表示这是HTTP_HOST
中的完整字符串,之前或之后都没有。因此,如果随请求一起传递的域名与www.example.com
完全匹配,则整个URI (.*)
将重定向到example.com
,从而剥离www.
从前面开始。
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?(.*)$ /$1.php [L]
-f
的{{1}}标志测试第一个参数是否是实际存在的文件。在这种情况下,它通过添加{{1}来测试RewriteCond
的值,这将是REQUEST_FILENAME
之类的URI的最后一部分(file
)作为PHP文件存在扩展到测试参数。
因此,如果example.com/directory/file
实际存在,那么对不存在的.php
的请求将在此处以file.php
静默重写到其对应的PHP文件中。因此,如果file
没有相应的$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}
等,但不会将其捕获以供重复使用GET
会抓取POST
后的所有内容以及下一个空格,例如/([^\ ]+)
中的/
。index
字面上匹配好的,然后以下GET /index.php
将\.php
抓取到RewriteRule
并具有上述条件,并且实际上重定向浏览器以删除{{1}扩展名,因此浏览器的结束网址看起来像index
。
换句话说,如果浏览器使用%1
扩展名请求.php
,则会将用户重定向到/index
以剥离/directory/file.php
。
.php
这个匹配原始请求中包含/directory/file
的任何内容,但它不必位于URI的开头。换句话说,.php
会匹配,RewriteCond %{THE_REQUEST} ^.*/index
RewriteRule ^(.*)index.php$ /$1 [R=301,L]
也会匹配。无论它匹配什么,它都被重定向到之前索引部分。让我们分解一下:
/index
会将开头的所有内容与/directory/index
/directory/subdir/index.php
..来自上面匹配的内容然后将其重定向到^(.*)
组件,因此如果浏览器直接请求,则$1
之类的网址会被重定向到指向更干净的网址:index.php
$1
出现在地址栏中。
答案 1 :(得分:1)
为您的.htaccess
代码添加了内嵌评论。
# If URL contains "www."
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
# remove it for ALL request
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
# If adding ".php" to the URL points to a file
RewriteCond %{REQUEST_FILENAME}\.php -f
# Serve the PHP file
RewriteRule ^/?(.*)$ /$1.php [L]
# If a URL request contains ".php"
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php
# Redirect to the same URL but without ".php"
RewriteRule ^/?(.*)\.php$ /$1 [L,R=301]
# If the request points to index.php
RewriteCond %{THE_REQUEST} ^.*/index
# Remove and redirect to "/"
RewriteRule ^(.*)index.php$ /$1 [R=301,L]