【问题标题】:Using htaccess and PHP to request data and rewrite URLs使用 htaccess 和 PHP 请求数据和重写 URL
【发布时间】:2019-09-22 10:42:54
【问题描述】:

这个让我卡住了,所以我希望有人能指出我正确的方向。

我有一个名为 blog_posts_content 的数据库来保存我的所有帖子。然后我有一个 viewpost.php 文件,它请求与 postSlug 匹配的帖子内容,并在“id”上发出 get 请求,如下所示:

<?php require($_SERVER['DOCUMENT_ROOT'] . '/includes/config.php');

$stmt = $db->prepare('SELECT * FROM blog_posts_content WHERE postSlug = :postSlug');
$stmt->execute(array(':postSlug' => $_GET['id']));
$row = $stmt->fetch();

//if post does not exists redirect user.
if($row['postID'] == ''){
    header('Location: ./');
    exit;
}

?>

这是数据库中的示例 postSlug ->

https://website.co.uk/testfolder/viewpost.php?type=services&category=webdesign&id=postname

然后我试图让这个显示为

https://website.co.uk/testfolder/services/webdesign/postname

到目前为止,我的测试文件夹中有这个 htaccess 文件

RewriteEngine On
RewriteBase /testingfolder/

RewriteRule ^([^/]+)/([^/]+)/?$ catpost.php?category=$1&id=$2 [L]
RewriteRule ^a-(.*)-(.*)$ archives.php?month=$1&year=$2 [L]

RewriteCond %{REQUEST_FILENAME} !-d [NC]
RewriteCond %{REQUEST_FILENAME} !-f [NC]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ viewpost.php?type=$1&category=$2&id=$3 [QSA,L]

测试文件夹包括以下文件:

索引 观点 猫帖

所以我将 index.php 作为主页当然,viewpost 请求帖子内容,然后 catpost 显示类别。

现在我希望我已经足够详细地介绍了背景,所以现在开始讨论这个问题。

上面没有显示页面,所以如果我在索引上并点击上面概述的 slug 的链接,我会根据 php 请求重定向回索引页面。

如果我只是使用这个 htaccess 并且只使用 postSlug 作为帖子名,那么我可以让帖子显示

RewriteEngine On
RewriteBase /testfolder/

RewriteRule ^category/(.*)$ catpost.php?id=$1 [L]
RewriteRule ^a-(.*)-(.*)$ archives.php?month=$1&year=$2 [L]

RewriteCond %{REQUEST_FILENAME} !-d [NC]
RewriteCond %{REQUEST_FILENAME} !-f [NC]
RewriteRule ^(.*)$ viewpost.php?id=$1 [QSA,L]

但是,我的网址最终变成了

https://website/testfolder/postname

我在质疑是php请求还是htaccess规则。

我该如何解决这个问题?

【问题讨论】:

    标签: php .htaccess web mod-rewrite


    【解决方案1】:

    拥有一个路由器会简化这一点。以下是构建一个的方法。

    这将简化您要完成的工作。大多数 PHP 框架、Wordpress 和其他 CMS 都在做类似的事情。

    .htaccess

    这会将所有请求重写到您的index.php

    <IfModule mod_rewrite.c>
            RewriteEngine On
    
            RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule ^(.*)$ /index.php/$1 [L]
    </IfModule>
    

    您可以从那里将请求路由到正确的文件。

    index.php

    <?php
    
    $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    $segments = explode('/', $uri);
    
    switch($segments[1]) {
        case "posts":
            // Do your posts stuff here.
            break;
        case "category":
            // Do your category stuff here.
            break;
    }
    

    如果您使用此页面的 URL stackoverflow.com/posts/55977515/,我们会看到域 posts55977515,这是您帖子的 ID。因此,他们使用 URL 段来确定我们正在请求的页面,而不是使用查询参数的 Stack Overflow。这是该过程的简化版本:

    1. 他们使用上面的 switch 语句来确定我们想要什么类型的页面
    2. 好的,我们想要posts
    3. 他们想要所有帖子还是特定帖子?
    4. 好的,有帖子ID55977515
    5. 我们需要从数据库中获取该帖子并显示它

    在上面的示例中,Do your posts stuff here. 表示您需要将代码放在哪里才能获得特定的帖子。

    Example router 供你玩。我建议你创建一个包含这个的文件,让它工作,然后慢慢开始添加更多代码。

    【讨论】:

    • 感谢您的建议和对与您的回答的长期差距表示歉意。我试图理解你的回复。我不确定我应该在开关功能之间放置什么。对不起,如果它看起来很明显。
    • 我已经更新了我的答案,希望能澄清你需要做什么。如果您仍然需要帮助,请告诉我。如果你这样做了,请告诉我你尝试了什么,什么没有奏效。谢谢!
    猜你喜欢
    • 2016-12-05
    • 2012-04-29
    • 2012-08-25
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多