您的重写规则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.