4

在过去的一个小时里,我通过搜索、复制和粘贴等方式制作了这个 .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]

如果有任何提示,请将它们扔在那里。

4

2 回答 2

5
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匹配

好的,然后下面的内容RewriteRuleindex捕获到%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出现在地址栏中。

于 2013-08-14T16:18:58.673 回答
2

.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]
于 2013-08-14T16:25:01.490 回答