0

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

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

我遇到的问题导致example文件名(my_example.png)中的图像由于与规则混淆而无法加载。

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

我只想知道正确的解决方案是什么。在 mod_rewrite 的世界里我还有很多东西要学,我想知道是否有针对此类问题的已实施修复,或者你是否真的应该让规则更具体。

4

2 回答 2

2

在你的规则前面加上这一行:

RewriteCond %{REQUEST_FILENAME} !-f

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

于 2013-01-14T23:36:27.720 回答
1

您的重写规则RewriteRule example actual-page.php [L]意味着:

在当前 url 中查找正则表达式example,如果找到,将 URL 替换为actual-page.php. 然后终止重写过程并忽略进一步的规则(L-flag)。

如果字符串“example”出现在 url 中的任何位置,包括“example.png”,也包括“another-example-from-a-different-url”,则此正则表达式将触发。

因此,确保不要使用正则表达式搜索任何地方,而是告诉它匹配整个 url 字符串,或者至少是重要部分,这是一个非常好的主意。这样做的语法字符是“^”表示“字符串开始”,“$”表示“字符串结束”。这会将您的规则更改为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]

This has an inverse logic: If the first rule matches, and the requested filename is either a file, or a directory or a symbolic link, then the rewriting does not take place. This will cancel rewriting if a real ressource is requested. Otherwise the same URL is tried in the second RewriteRule, and the php-script.php is executed and can then analyze the requested URL and act upon it.

于 2013-01-15T00:21:06.740 回答