这个 Rewrite 规则是什么意思?

9

我正在安装 PHPancake,有一个文件夹的结构如下:

application/
install/
library/
public/
sql_schema/
install.html
install.php

这条规则是什么意思?
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /vote/public/index.php [NC,L]
3个回答

14

这个重写规则有两个部分。第一个部分规定了如果所请求的文件名是具有大于0大小的常规文件(-s)、符号链接(-l)或目录(-d),则重写到空地址,即不会采取任何操作。 [NC,L] 表示该规则是不区分大小写的,并且是匹配这些条件的最后一条规则。

所有其他请求都将转发到 /vote/public/index.php

这个重写的目的是可以从服务器获取实际存在的文件而不受干扰。如果没有第一个规则,每个文件请求(css和js文件、图像等)都会传递到 index.php,这会导致很糟糕的情况。

通常这只写在一个声明中。您可以否定条件,然后 [OR] 语句也可以去掉:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /vote/public/index.php [NC,L]

这等价于原始语句。


@Tatu Ulmanen: 你能解释一下 RewriteCond %{REQUEST_FILENAME} -f 的意思吗?这和 -s-f 不同在哪里?另外,普通文件(非二进制文件)是什么? - Ashish Ranjan

0

这些主要是标准的重写规则,它们检查所请求的文件(或目录或符号链接)是否存在于磁盘上,如果存在,则应使用该文件/目录等。

所有其他匹配项都应转到 /votes/public/index.php


从@Tatu Ulmanen的回答中,您能解释一下RewriteCond %{REQUEST_FILENAME} -f是什么意思吗?它只是选项-s-f之间不同的“大小”吗?还有,什么是常规文件(非二进制文件)? - Ashish Ranjan

0

第一条规则将通过所有可以映射到具有大于零大小的常规文件(-s),符号链接(-l)或目录(-d)的请求。其他所有请求都将由第二条规则获取并重写为/vote/public/index.php


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接