我需要一些帮助来弄清楚以下URL重写规则的含义。我可以理解前三行,但我遇到了index.php/$1
部分。 /
在这条规则中的含义是什么?我总是希望在文件名之后看到的唯一的东西是查询字符串分隔符(?
)。这是我第一次看到/
作为分隔符。它究竟意味着什么?
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [PT,L]
</IfModule>
<IfModule mod_rewrite.c>...</IfModule>
块确保仅在加载mod_rewrite
模块时才考虑该块中包含的所有内容。否则,您将面临服务器错误或所有URL重写请求都将被忽略。
以下两行是跟随它们的RewriteRule
线的条件。这意味着只有满足这两个条件才会评估RewriteRule
。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
这些行只是声明只有在服务器上没有与URI匹配的现有文件或文件夹时才会发生重写(RewriteRule
行)。如果它们确实存在,那么它们将被服务,除非有其他指令阻止它,否则将发生重写。
最后一行将进行实际重写。它将采取跟随网站域名的任何内容并将其附加到将以index.php/
开头的重写请求。
这是一个例子。
让我们说你提出example.com/example-page.html
的请求。
如果名为example-page.html
的虚拟主机根文件夹中没有现有文件或文件夹,则最后的重写规则将重写请求,使其看起来像example.com/index.php/example-page.html
。
应用程序重写这样的请求的主要原因是为了确保它们具有单个入口点,通常称为引导程序,从安全角度来看,这被认为是一种很好的做法,并且还提供了对请求的更精细控制。
在我看来,这是very good beginner friendly tutorial的mod_rewrite
。
它只是重写网址名称。
例如,这个网址:
http://www.example.com/something/else
将是相同的:
http://www.example.com/index.php/something/else