繁体   English   中英

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

[英]mod_rewrite: Image file name being mistaken as rewrite value

在我的.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的世界中,我还有很多要学习的东西,我想知道是否有针对此类问题的一些已实现的修复程序,或者您是否真的应该使规则更具体。

在这一行之前添加规则:

RewriteCond %{REQUEST_FILENAME} !-f

这意味着以下规则仅在所请求的URL不是真实文件时才匹配。

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

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

如果字符串“ example”出现在URL中的任何位置(包括“ example.png”,也包括“另一个示例来自另一个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]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM