mod_rewrite:图像文件名被误认为是重写值

时间:2013-01-14 23:35:03

标签: php .htaccess mod-rewrite

在我的.htaccess文件中,我有这个重写规则:
RewriteRule example actual-page.php [L]

简单地改写:
www.mysite.com/examplewww.mysite.com/actual-page.php

我遇到的问题导致文件名(my_example.png)中带有example的图片因为与规则混淆而无法加载。

我通过将规则更改为:RewriteRule /example /actual-page.php [L]

来解决我的问题

我只是想知道对此的正确解决方案是什么。我仍然需要在mod_rewrite的世界中学到很多东西,我想知道是否有一些实现的修复这种问题,或者你真的应该让规则更具体。

2 个答案:

答案 0 :(得分:2)

在此行中添加您的规则:

RewriteCond %{REQUEST_FILENAME} !-f

这意味着只有当请求的网址不是真实文件时,以下规则才会匹配。

答案 1 :(得分:1)

您的重写规则RewriteRule example actual-page.php [L]表示:

在当前网址中找到正则表达式example,如果找到,请将网址替换为actual-page.php。然后终止重写过程并忽略其他规则(L-flag)。

如果字符串"示例"将触发此正则表达式发生在网址的任何地方,包括" example.png",还有"另一个例子来自不同网址"。

因此,确保不使用正则表达式搜索任何地方,但要告诉它匹配整个url字符串,或者至少是一个重要部分,这是一个非常好的主意。这样做的句法字符是" ^" for" string start"和" $" for" string end"。这会将您的规则更改为RewriteRule ^example$ actual-page.php [L]

另一方面,这可能不起作用,因为url确实包含斜杠,不允许匹配。您可以添加它:RewriteRule ^/example$ actual-page.php [L]。请注意,查询字符串从不在此匹配中使用,您无法在RewriteRule中检测到它,但必须在其前面使用RewriteCond子句。

将任何虚拟URL重写为现有PHP脚本但不触及任何现有资源(如HTML文件,图像等)的通用用例如下:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule .* - [L]
RewriteRule .* php-script.php [L]

这有一个相反的逻辑:如果第一个规则匹配,并且请求的文件名是文件,目录或符号链接,则不会进行重写。如果请求真正的资源,这将取消重写。否则,在第二个RewriteRule中尝试使用相同的URL,然后执行php-script.php,然后可以分析请求的URL并对其进行操作。