我有一个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]
如果连字符(-
(位于字符类的末尾(或开头(,则不需要对其进行转义。
但是,这仍然不适用于login
和404
URL(除非在文件名后面加上逗号(。尽管这突出了另一个潜在的问题。这些表示物理文件,因此应该具有文件扩展名。通过省略文件扩展名,Apache不一定知道如何处理它。默认情况下,它只会被发送回客户端(未处理(,没有Content-Type
头,然后留给浏览器解释——可能是text/html,但可能是text/plain(html向客户端公开(,这取决于浏览器。
如果login
需要作为PHP处理,那么它应该被称为login.php
。如果您希望能够以/login
(无扩展(的身份从客户端访问它,那么您需要在.htaccess
中添加一个rewrite指令,就像对/qwerty
所做的那样。为了避免冲突,此指令需要在现有指令之前执行。(除非您更改/qwerty
URL的格式以将其标识为用户,否则您不能使用名为"登录"的用户名。(
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_]
相同。