我正在尝试在Ubuntu 12.04服务器上使用mod_rewrite来使我的URL更具可读性,但是我想为图像和css文件添加一个例外。
我的输入网址采用\controller\action
格式,然后重新写入index.php?controller=controller&action=action
。我想添加一个例外,以便在指定图像或css文件时,不会重写URL,例如\images\image.jpg
不会被重写。
我的.htaccess代码如下:
RewriteEngine on
RewriteCond %{REQUEST_URI} !(\.gif|\.jpg|\.png|\.css)$ [NC]
RewriteRule ^([a-zA-z]+)/([a-zA-z]+)$ test.php?controller=$1&action=$2 [L]
RewriteRule ^([a-zA-z]+)/([a-zA-z]+)/([^/]*)$ test.php?controller=$1&action=$2&$3 [L]
我的重写代码工作正常,网址按预期显示,但即使我请求图片,网址仍在重写。看来我的RewriteCond被忽略了,有人建议为什么会这样?
答案 0 :(得分:0)
rewriteCond规则仅适用于下一个RewriteRule。
所以你需要至少为你的seconde RewriteRule重复rewriteCond。
没有肯定会有更好的事情要做。 例如,通常的做法是测试url是否匹配真实的静态资源。如果你的所有php代码都在web目录之外(在libraries目录中,index.php除外),那么直接在文档根目录下可用的所有styatic ressource都只能是js文件,css文件或图像文件。
所以这是通常的做法:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-z]+)/([a-zA-z]+)$ test.php?controller=$1&action=$2 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-z]+)/([a-zA-z]+)/([^/]*)$ test.php?controller=$1&action=$2&$3 [L]
但这是一个起点。我们当然可以找到一些东西,以避免为此做两个规则(也许我稍后会看看)
答案 1 :(得分:0)
RewriteCond仅适用于您的第一个RewriteRule,它应该被复制用于第二个规则。但是,我认为最好在之前添加非重写规则,以排除现有内容。
# Do nothing for files which physically exist
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]
# your MVC rules
RewriteRule ^([a-zA-z]+)/([a-zA-z]+)$ test.php?controller=$1&action=$2 [L]
RewriteRule ^([a-zA-z]+)/([a-zA-z]+)/([^/]*)$ test.php?controller=$1&action=$2&$3 [L]