Использование htaccess и PHP для запроса данных и перезаписи URL - PullRequest
2 голосов
/ 04 мая 2019

Это застряло у меня, поэтому я надеюсь, что кто-то сможет указать мне правильное направление.

У меня есть база данных, в которой хранятся все мои сообщения, которая называется blog_posts_content.Затем у меня есть файл viewpost.php, который запрашивает содержимое публикации, соответствующее postSlug, с запросом get по «id», как показано ниже:

<?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 viewpost catpost

Поэтому я рассматриваю index.php как домашнюю страницу курса, viewpost - запрос содержимого публикации изатем catpost для отображения категорий.

Теперь я надеюсь, что достаточно подробно изложил предысторию, так что теперь к проблеме.

Приведенное выше не показывает страницу, поэтому, если я нахожусь в индексе и нажмите ссылку сПлагин, описанный выше, перенаправляется обратно на страницу индекса в соответствии с запросом 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]

Однако, шth, что мой url заканчивается как

https://website/testfolder/postname

Я задаю вопрос, является ли это запросом php или правилами htaccess.

Как мне решить эту проблему?

1 Ответ

1 голос
/ 04 мая 2019

Наличие роутера упростит это.Вот как вы можете это сделать.

Это упростит то, что вы пытаетесь достичь.Большинство 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/, мы видим домен, posts и 55977515 который является идентификатором вашего сообщения.Таким образом, вместо переполнения стека с использованием параметров запроса, они используют сегменты URL, чтобы выяснить, какую страницу мы запрашиваем.Вот упрощенная версия процесса:

  1. Они используют оператор switch, как указано выше, чтобы выяснить, какой тип страницы мы хотим
  2. Хорошо, мы хотим posts.
  3. Они хотят все сообщения или конкретное сообщение?
  4. Хорошо, есть идентификатор сообщения 55977515
  5. Нам нужно получить это сообщение из базы данных и показать его

В приведенном выше примере, где написано Do your posts stuff here., которое указывает, куда вам нужно поместить свой код, чтобы получить конкретное сообщение.

Пример маршрутизатора для васиграть с.Я предлагаю вам создать файл только с этим, заставить его работать, а затем медленно начинать добавлять больше кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...