1

我正在尝试在 Ubuntu 12.04 服务器上使用 mod_rewrite 以使我的 URL 更具可读性,但是我想为图像和 css 文件添加一个例外。

我的输入 URL 采用格式\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]

我的重写代码工作正常,并且 URL 按预期出现,但是即使我请求图像,URL 仍在重写。看来我的 RewriteCond 被忽略了,有人对这可能的原因有什么建议吗?

4

2 回答 2

0

rewriteCond 规则仅适用于下一个 RewriteRule。

所以你至少需要为你的第二个 RewriteRule 重复 rewriteCond。

不,当然还有更好的事情要做。例如,一种常用的方法是测试 url 是否匹配真正的静态资源。如果您的所有 php 代码都在 web 目录之外(在库目录中,除了 index.php),那么文档根目录上直接可用的所有 styatic 资源只能是 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]

但这是一个起点。我们当然可以找到一些东西来避免为此做 2 条规则(也许我稍后会看看)

于 2012-12-10T12:50:48.780 回答
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]
于 2012-12-10T12:52:14.697 回答