php - 如何在没有物理页面文件的情况下创建像 wordpress 一样的 URL?
问题描述
我需要像 wordpress 那样创建普通的网址。例如:https://www.website.ext/mypage 并让他们从数据库中加载页面,而不仅仅是静态页面文件。但就像 wordpress 和其他 cms 的做法一样。
url参数的使用我很清楚,比如/mypage?ID=124&fname=John 但是那些很草率,也会招来黑客。如果可以避免的话,我不希望在我的网址中出现这些内容。
他们如何获得仅存在于数据库中的页面的 url?您如何将https://www.website.ext/mypage连接到浏览器中显示的内容而没有实际的“mypage”文件并且仍然具有这些干净的 url?
我只是无法弄清楚它是如何完成的。我对 .htaccess 的东西有点搞砸了,但我对 htaccess 的东西并没有真正受过教育。
我想我应该补充一点,我正在使用 php7 和 MySQL 数据库。
解决方案
您可以通过在入口页面(例如index.php
)上重定向流量来模拟它。然后根据请求的 URL 执行一些逻辑,以基于$_SERVER["QUERY_STRING"]
或您可以使用的其他 url 参数(例如$_GET
全局变量)呈现实际页面。
.htaccess
您可以使用这样的 on将流量重定向到单个入口点apache
。
RewriteEngine On
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L,QSA]
Options -Indexes
我创建了一个实际执行此操作的个人脚本,如果您有兴趣,可以在 github上查看它的底层逻辑。
使用它有一些缺点,例如404
在您自己的路由上处理页面请求。
在被重定向到index.php
并假设您URL
看起来像这样之后https://sample.com/?page=1
您可以添加一个switch case
以基于该变量呈现页面,例如:
<?php
$page = isset($_GET["page"]) ? $_GET["page"] : 0;
switch($page) {
case 1:
require "sample/page/if/one/page.php";
break;
case 2:
require "sample/page/if/two/page.php";
break;
default:
require "default/page/home.php";
break;
}
这是一个快速而肮脏的例子,但可以通过创建一个路由器类来大大改进。您还可以创建一个可能的页面数组并检查请求的页面是否在该数组中,然后呈现它,如果不是,则显示您的404
页面。
我只是展示了一个非常简约的示例,它使用$_GET
全局变量来要求一些页面,但这也可以用于DB
通过利用变量的值来获取动态数据。
推荐阅读
- python - 不能在 tf.data 管道中使用 .map_on_gpu()
- localhost - 无法连接到我的 Tor 网站(网络服务器是用 wamp 制作的)并且我无法使用 127.0.0.1 连接到我的网站
- python - 当我使用 time.sleep 时,它会提前暂停
- java - 转换 Matrix4f 或四元数 [Minecraft 21w18a Fabric]
- c# - 如何绑定来自同一个 ICollectionView 的不同 UserControl 中的对象的子属性?
- python - For 循环遍历 Pandas DataFrame 中的所有列,Python 中的一(或两)列除外以进行缩放
- firebase - auth 和 access_token 参数之间的混淆
- python - 麻烦制作中缀到后缀转换器臂组件
- javascript - 有没有办法为 Eclipse PDT 中的 javascript 文件自定义语法高亮显示?
- javascript - 使用 Rails Active Storage 和 Stimulus 对图像或附件进行排序