首页 > 解决方案 > 如何阻止 htaccess 重写规则重写所有 url

问题描述

我有一个 mod 重写问题,我是 htaccess 的新手,不是因为我试图做一个 mod_rewrite 和我尝试打开的链接假设我在 profile.php
继承我的代码

.htaccess文件内容

ErrorDocument 404 /404,/
RewriteEngine On
RewriteRule ^([a-z\A-Z\0-9\_\-]+)$ profile.php?username=$1
RewriteRule ^([a-z\A-Z\0-9\_\-]+)/$ profile.php?username=$1

我只是想让 localhost/qwerty 显示 profile.php 其他任何内容都应该显示正常页面,如果它不存在,它会显示 404 错误


`profile.php` 内容
<?php
$conn=mysqli_connect("localhost", "root", "", "databasename");
if(!$conn) {        
    die("connection failed". mysqli_connect_error());
}

if(!isset($_GET['username'])) {
    header("location:./login,/?error=true");
} else {   
     $username = $_GET['username'];
     $quer="SELECT * FROM users WHERE username='$username'";

     $result = $conn->query($quer);
     if(!$row = $result->fetch_assoc()) {
         echo 'user does not exist';
      } else {
          echo 'user exists';
      }
}
?>



现在我的文件树
                                               htdocs(xampp)
                                                   |
 =======================================================================================
 |         |          |              |                       |                         |
login,    404,     style.css      profile.php              index.php               .htacccess




现在的问题是没有任何样式表(或 javascript 文件)加载,http://localhost 上的所有页面现在都假定为 `profile.php`,并且在 `profile.php` $_GET['username '] 显示 'PROFILE.PHP' 而不是 'USER123'
只是为了清楚我想要它,如果 http://localhost/login,是 url 然后登录,加载(我什至在登录末尾添加了一个逗号以使.htaccess 不将登录视为用户名,但这不起作用)

标签: php.htaccess

解决方案


RewriteRule ^([a-z\A-Z\0-9\_\-]+)$ profile.php?username=$1

问题出在正则表达式上——你不应该用反斜杠来转义0字符类中的文字。在这样做时,您正在增加字符范围(从“char code 0”而不是“char code 48” - 文字零),因此包括点(.- 字符代码 46)。这会导致profile.php?username=<something>(和任何文件)被进一步重写,从而获得$_GET['username']价值profile.php- 正如您所说。

删除所有反斜杠转义...

RewriteRule ^([a-zA-Z0-9_-]+)$ profile.php?username=$1 [L]

如果连字符 ( -) 位于字符类的末尾(或开头),则不需要对其进行转义。

但是,这仍然不适用于login404URL(除非您在文件名后附加逗号)。尽管这凸显了另一个潜在问题。这些代表物理文件,因此应该具有文件扩展名。通过省略文件扩展名,Apache 不一定知道如何处理/处理它。默认情况下,它将简单地发送回客户端 - 未处理 - 没有Content-Type标题,然后留给浏览器解释 - 可能是 text/html,但也可以是 text/plain(HTML 向客户端公开),具体取决于浏览器。

如果login需要作为 PHP 处理,那么应该调用login.php. 如果您希望能够从客户端访问它/login(无扩展名),那么您需要一个额外的重写指令 in .htaccess,就像您对/qwerty. 为了避免冲突,该指令需要放在您现有的指令之前。(除非您更改URL 的格式以将其标识为用户,否则您不能拥有名为“login”的用户名。)/qwerty

404是一个错误文档,无论如何都不应该直接访问。所以这应该只是404.php(或404.html)并在ErrorDocument指令中引用。(您还附加了一个尾部斜杠/404,/,因此无论如何这不会为该文件提供服务。)

例如:

Options -MultiViews

ErrorDocument 404 /404.php

RewriteEngine On

RewriteRule ^login$ login.php [L]
RewriteRule ^([\w-]+)$ profile.php?username=$1 [L]

速记字符类\w[a-zA-Z0-9_].


推荐阅读