我今天正在学习重写和PHP路由。我写了以下.htaccess文件:
RewriteEngine On
RewriteRule ^(.+)$ testing.php?url=$1 [NC,L]
测试.php具有以下代码:
<?php
echo $_GET["url"];
?>
例如,当我输入以下 URL 时:http://localhost/tests/Hello 浏览器中显示以下内容:
testing.php
但我期待"你好"显示而不是"测试.php"。我尝试将NC更改为QSA,并且成功了,但是为什么第一种情况不起作用?
谢谢。
URL 可能被多次重写。
第一次重写/Hello
testing.php
,然后在内部发出单独的请求testing.php
并再次通过重写引擎运行。这将为您提供 URL 参数testing.php
。
使用QSA
意味着在第二个请求时,它会追加到查询字符串,而不是覆盖它。如果您查看$_SERVER['QUERY_STRING']
您可能会看到类似url=testing.php&url=Hello
(或类似(的内容,而 php 只是使用url
中的最后一个值。
使用NC
不是必需的,因为您使用的模式没有大小写(无论大小写如何,.+
匹配任何字符的一个或多个(。
使用L
表示停止处理此请求中的规则,但不停止后续请求(包括透明/内部后续请求(中的处理规则。
通常,如果请求是针对存在的文件发出的,则可以通过告诉mod_rewrite忽略请求来解决,使用如下RewriteCond
:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ testing.php?url=$1
这告诉 apache,如果请求的文件名不是文件也不是目录,请处理规则。完成此操作后,对testing.php
的请求将看到文件存在,条件失败,因此不会再处理规则。如果存在其他规则,没有什么可以阻止它们适用。而且,仅供参考,条件仅适用于下一个规则。因此,如果您有多个规则,则需要针对每个规则的这些规则。
QSA 代表 Query-String-Append,这意味着首次发送的查询字符串被追加。使用 NC,您只执行nocase
,这意味着重写规则将以不区分大小写的方式匹配。
L 只是表示 RewriteRule 将在该规则之后停止处理它。