RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,
这就是RewriteCond最原始、基础的功能,为了方便理解,下面来看看几个例子。
(一) 重写规则的定义和语法
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Redirect Trailing Slashes...
# [L]意味着立即停 止重写操作 .* 是指匹配所有URL中不包含换行字符 R[=code](force redirect) 强制外部重定向
RewriteRule ^(.*)/$ /$1 [L,R=301]
#'-d'(目录) 将TestString视为一个路径名并测试它是否为一个存在的目录。
#'-f'(常规文件) 将TestString视为一个路径名并测试它是否为一个存在的常规文件。
#'-s'(非空的常规文件) 将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
#'-l'(符号连接) 将TestString视为一个路径名并测试它是否为一个存在的符号连接。
#'-x'(可执行) 将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
#'-F'(对子请求存在的文件) 检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
#'-U'(对子请求存在的URL)
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# RewriteRule ^ index.php [L]
# RewriteRule ^(.*)$ test.php
# 如果上面的条件成立的话, index.php 就变成"" 空,也就是说把index.php 隐藏掉,哈哈
# RewriteRule (.*)$ test.php // 如果以上的结果成立,链接直接跳转到test.php
# RewriteCond %{REQUEST_FILENAME} !-f //如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)
# RewriteCond %{REQUEST_FILENAME} !-d //#如果目录存在就直接访问目录不进行RewriteRule
# RewriteCond %{REQUEST_URI} !^.*(.css|.js|.gif|.png|.jpg|.jpeg)$ //#如果是这些后缀的文件,就直接访问文件,不进行Rewrite
</IfModule>
(二)重写规则的应用
#ci 框架隐藏index.php 方式
#RewriteEngine on
#RewriteCond $1 !^(index\.php|images|robots\.txt)
#RewriteRule ^(.*)$ /index.php/$1 [L]
# ^(.*)$ 表示匹配任意的字符串 或网址
# RewriteRule ^(.*)$ index.php/$1 注意 ^(.*)$ -> index.php/$1 意思为 任意网址重新route到 index.php开头的,$i的意思表示 ^(.*)
# http://www.baidu.com/1/2/3 --->改成文档路由 http://www.baidu.com/index.php/1/2/3
#应用替换时,前面第一个()中匹配的内容后面就用$1引用,第二个()中匹配的就用$2应用…