如何阻止htaccess重写规则重写所有url



我有一个mod重写问题,我是htaccess的新手,不是因为我试图执行mod_rewrite,而是因为我试图打开的链接假设我在profile.php中。
这是我的代码

.htaccess文件内容

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

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


`profile.php `contents
<?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不将登录视为用户名,但这不起作用(
RewriteRule ^([a-zA-Z-9_-]+)$ profile.php?username=$1

问题出在正则表达式上——不应该是反斜杠,以转义字符类内的文本0。在这样做的过程中,您增加了字符范围(从"字符代码0"而不是"字符代码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(无扩展(的身份从客户端访问它,那么您需要在.htaccess中添加一个rewrite指令,就像对/qwerty所做的那样。为了避免冲突,此指令需要在现有指令之前执行。(除非您更改/qwertyURL的格式以将其标识为用户,否则您不能使用名为"登录"的用户名。(

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_]相同。

最新更新