php - 如何阻止 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 不将登录视为用户名,但这不起作用)
解决方案
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]
如果连字符 ( -
) 位于字符类的末尾(或开头),则不需要对其进行转义。
但是,这仍然不适用于login
和404
URL(除非您在文件名后附加逗号)。尽管这凸显了另一个潜在问题。这些代表物理文件,因此应该具有文件扩展名。通过省略文件扩展名,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_]
.
推荐阅读
- javascript - Materializecss 可折叠组件无法正常工作
- ruby - 方法仅适用于 .select 或 .reject 但不适用于 .map 解决方案
- javascript - 如何定义我想在其上使用“.channels”的公会?
- matlab - 将数据添加到特定的子图
- github - GitHub markdown 中的下载链接
- html - 如何删除仅出现在 Edge 中的杂散下划线?
- c - 怎么修?尝试释放动态分配的内存时触发异常
- reactjs - 使用不同的 props 重用多个 react 组件实例
- angular - 在共享主机上使用带有 rendertron 的 Angular 6 应用程序(不允许使用 nodejs)
- php - Symfony Panther:无法使用表单登录