在我的.htaccess
文件中,我有这个重写规则:
RewriteRule example 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的世界中学到很多东西,我想知道是否有一些实现的修复这种问题,或者你真的应该让规则更具体。
答案 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并对其进行操作。