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重写结束,并开始另一个重写循环。有一个很好的模式可以解释重写过程,“然后终止重写过程并忽略进一步的规则”——这并不意味着。这意味着停止当前的重写迭代,并再次从头开始