解释htaccess规则?

时间:2013-08-14 16:07:25

标签: 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]

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

2 个答案:

答案 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]