首页 > 解决方案 > 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 并且成功运行,但为什么第一个案例不起作用?

谢谢你。

标签: php.htaccess

解决方案


URL 很可能被多次重写。

第一次重写/Hellotesting.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将看到文件存在,条件失败,因此规则不会被处理额外的时间。尽管存在其他规则,但没有什么能阻止它们的应用。而且,仅供参考,条件仅适用于下一条规则。因此,如果您有多个规则,则每个规则都需要这些条件。


推荐阅读