htaccess and php routing



我今天正在学习重写和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 可能被多次重写。

第一次重写/Hellotesting.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 将在该规则之后停止处理它。

最新更新