Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mod_rewrite:图像文件名被误认为是重写值_Php_.htaccess_Mod Rewrite - Fatal编程技术网

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

Php mod_rewrite:图像文件名被误认为是重写值,php,.htaccess,mod-rewrite,Php,.htaccess,Mod Rewrite,在我的.htaccess文件中,我有一个重写规则:重写规则示例actual-page.php[L] 只需重写: www.mysite.com/example至www.mysite.com/actual page.php 我遇到的问题导致文件名(my_example.png)中带有example的图像由于与规则混淆而无法加载 通过将规则更改为:RewriteRule/example/actual-page.php[L] 我只是想知道正确的解决办法是什么。在mod_rewrite的世界里,我还有很多

在我的
.htaccess
文件中,我有一个重写规则:
重写规则示例actual-page.php[L]

只需重写:
www.mysite.com/example
www.mysite.com/actual page.php

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

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


我只是想知道正确的解决办法是什么。在mod_rewrite的世界里,我还有很多东西要学习,我想知道是否有一些针对此类问题的解决方案,或者您是否真的应该让规则更加具体

在规则前面加上这一行:

RewriteCond %{REQUEST_FILENAME} !-f

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

在规则前面加上这一行:

RewriteCond %{REQUEST_FILENAME} !-f

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

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


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

如果字符串“example”出现在url中的任何位置(包括“example.png”)以及“other-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]

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

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


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

如果字符串“example”出现在url中的任何位置(包括“example.png”)以及“other-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]

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

您的解决方案对
examply\u my.png
file没有帮助您的解决方案对
examply\u my.png
文件没有帮助,然后终止重写过程并忽略其他规则”“不是这个意思。这意味着停止当前的重写迭代,重新从头开始标志会导致mod_rewrite停止处理规则集。在大多数上下文中,这意味着如果规则匹配,则不会处理进一步的规则。这对应于Perl中的最后一个命令,或C中的break命令。使用此标志指示应立即应用当前规则,而不考虑进一步的规则。”如果重写的结果是在客户端发送的新请求中重定向到一个新位置,那么只有重新启动才会结束对于这里的
/zzzzz
请求,您希望在
$\u GET
中得到什么?可能是这样。我现在没有带apache测试,它不是。get中有
a=>foo
。因为第4行以url重写结束,并开始另一个重写循环。有一个很好的模式可以解释重写过程,“然后终止重写过程并忽略进一步的规则”——这并不意味着。这意味着停止当前的重写迭代,并再次从头开始