如果目录存在,则RewriteRule添加查询

时间:2015-08-04 01:36:57

标签: apache .htaccess mod-rewrite

假设

将所有内容重定向到index.php,但Images文件夹除外(如果文件存在)。 例如:

/ main / test => ?的index.php控制器=主&安培;行动=测试

/image/exists.png =>图像/ exists.png

/image/another.png =>索引控制器=图像&安培;行动= another.png

当前代码

<IfModule mod_rewrite.c>
    RewriteEngine On
    Options +FollowSymlinks

    RewriteCond "%{REQUEST_FILENAME}" "!-f"
    RewriteRule ^image/(.*)$ index.php?controller=$1&action=$2 [NC,L]

    RewriteRule ^(.*)/(.*)/(.*)/(.*)/.*$ index.php?controller=$1&action=$2&v1=$3&v2=$4 [NC,L]
    RewriteRule ^(.*)/(.*)/(.*)/(.*)/$ index.php?controller=$1&action=$2&v1=$3&v2=$4 [NC,L]
    RewriteRule ^(.*)/(.*)/(.*)/(.*)$ index.php?controller=$1&action=$2&v1=$3&v2=$4 [NC,L]
    RewriteRule ^(.*)/(.*)/(.*)/$ index.php?controller=$1&action=$2&v1=$3 [NC,L]
    RewriteRule ^(.*)/(.*)/(.*)$ index.php?controller=$1&action=$2&v1=$3 [NC,L]
    RewriteRule ^(.*)/(.*)/$ index.php?controller=$1&action=$2 [NC,L]
    RewriteRule ^(.*)/(.*)$ index.php?controller=$1&action=$2 [NC,L]
    RewriteRule ^(.*)/$ index.php?controller=$1 [NC,L]
    RewriteRule ^(.*)$ index.php?controller=$1 [NC,L]
</IfModule>

不良反应和我请帮助的原因

如果我将路径放到现有文件夹中,您将被重定向到一条非常奇怪的路径。例如,如果我在浏览器中写入 localhost / image 之类的URL,我会得到像 localhost / image /?controller = Image 这样的URL。最后 - 它加载了一个好文件,但看起来很难看。

/ image =&gt; index.php?controller = image (但在浏览器的URL字段中: / image /?controller = Image

PS如果我使用Firefox,我会在没有查询的情况下获得良好的URI。我认为这是因为Firefox在URL的末尾添加了一个斜杠而没有扩展名。

如何&#34;修复&#34;它?

1 个答案:

答案 0 :(得分:1)

你的第一个问题是所有那些(。*),因为它们是贪婪的,REGEXP中的第一个将消耗直到行尾的所有字符。如果您只想要一个消耗最多 / 的REGEXP,请使用([^ /] *)([^ /] +)

接下来要排除真实文件,您将要使用SKIP指令,例如。将以下内容粘贴在规则集的顶部:

# Skip the next 10 RewriteRule is the requested file physically exists, in the image
# directory
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^image/ - [S=10]