重写被忽视?

时间:2012-12-10 12:29:45

标签: apache mod-rewrite

我正在尝试在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被忽略了,有人建议为什么会这样?

2 个答案:

答案 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]
相关问题