首页 > 解决方案 > 如何在没有物理页面文件的情况下创建像 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 数据库。

标签: phpmysql.htaccess

解决方案


您可以通过在入口页面(例如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通过利用变量的值来获取动态数据。


推荐阅读