我只是一个初学者,试图了解HTACCESS,但似乎无法在Google上找到任何可以解释下面代码含义的内容。我知道它可以制作漂亮的URL,但它的长篇描述是什么。请专业人士或专家可以指导我解释这一点。谢谢!
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
答案 0 :(得分:2)
让我们一行一行地看一下
<IfModule mod_rewrite.c>
这表示只有在目标服务器上安装并启用了mod_rewrite时才能读取标签之间的内容。
RewriteEngine On
这会打开RewriteEngine。没有它,没有RewriteRules生效。 (docs)
RewriteBase /
重定向请求时使用RewriteBase。据我所知,设置它永远不会受到伤害,即使有时它会自动进行。 (docs)
RewriteRule ^index\.php$ - [L]
这是第一个RewriteRule。如果对http://example.com/index.php
(包含或不包含查询字符串)发出请求,则不会重写该URL。 [L]
表示如果此规则匹配,则它是通过文件“传递”期间匹配的最后一条规则。因为不会重写URL,所以不会再通过.htaccess
文件“传递”。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
如果先前的规则不匹配,它将尝试匹配此规则。此规则匹配任何至少1个字符的网址。对http://example.com
的请求与此规则不符。如果RewriteRule的第一部分匹配,它将检查条件。第一个条件检查所请求的文件(%{REQUEST_FILENAME}
)是否不是现有文件(!-f
)。 -f
表示“是现有文件”,前缀!
否定了这一点。第二个条件类似,但测试所请求的文件是否不是现有目录。如果两个条件都为真,则请求将在内部重写为index.php
。 [L]
标志将停止重写此传递,在下一次传递期间,第一个规则将匹配,并完全停止重写。
有关RewriteCond
和RewriteRule
的可能性的详细信息,请参阅the documentation。