php - htaccess 和 php 路由
问题描述
我今天正在学习 Rewrite 和 PHP 路由。我写了以下 .htaccess 文件:
RewriteEngine On
RewriteRule ^(.+)$ testing.php?url=$1 [NC,L]
testing.php 有以下代码:
<?php
echo $_GET["url"];
?>
例如,当我输入以下 URL 时:http://localhost/tests/Hello 在浏览器中显示以下内容:
testing.php
但我希望显示“Hello”而不是“testing.php”。我尝试将 NC 更改为 QSA 并且成功运行,但为什么第一个案例不起作用?
谢谢你。
解决方案
URL 很可能被多次重写。
第一次重写/Hello
,testing.php
但随后在内部发出一个单独的请求,testing.php
并再次通过重写引擎运行。这将为您testing.php
提供 URL 参数。
使用QSA
意味着在第二个请求中它附加到查询字符串而不是覆盖它。如果您查看,$_SERVER['QUERY_STRING']
您可能会看到类似url=testing.php&url=Hello
(或类似)的内容,而 php 只是使用url
.
NC
不需要使用,因为您使用的模式没有大小写(.+
匹配一个或多个任何字符,无论大小写)。
usingL
表示停止处理本次请求中的规则,但不停止处理后续请求中的规则(包括透明/内部后续请求)。
通常这是通过告诉 mod_rewrite 忽略该请求来解决的,如果它是对一个使用类似存在的文件发出的RewriteCond
:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ testing.php?url=$1
它告诉 apache 如果请求的文件名不是文件也不是目录,则处理规则。有了这个,请求testing.php
将看到文件存在,条件失败,因此规则不会被处理额外的时间。尽管存在其他规则,但没有什么能阻止它们的应用。而且,仅供参考,条件仅适用于下一条规则。因此,如果您有多个规则,则每个规则都需要这些条件。
推荐阅读
- c# - C#按位否定!检查等价物
- python - 从 tkinter 中的窗口获取列表值
- php - Laravel 两次查询,如何一次查询?
- tensorflow - Tensorflow TFDV 不适用于特定的 NaN 值
- javascript - 使用 axios 获取本地 JSON 数据时遇到问题
- mysql - 有没有办法优化我的 NOT IN 查询以加快速度?
- apache-flink - 将 ROW() 用于嵌套数据结构
- cplex - CPLEX 将具有零目标系数的变量设置为正值
- r - 将日期转换为数字并返回日期
- node.js - 如何在没有任何缺点的情况下在 MongoDB 中正确地建立一对一的关系?