.htaccess - изменение URL - RewriteRule не работает - PullRequest
0 голосов
/ 04 сентября 2018

Я довольно новичок в этом, надеюсь, вы поможете мне решить эту проблему.

У меня есть структура URL, которая получает идентификатор из базы данных и показывает URL-адрес следующим образом:

www.website.com/post.php?P=18

Я хотел бы представить URL как:

www.website.com/post/18

В моем файле .htaccess я изменил его так:

RewriteEngine on
RewriteRule ^post/(\w+)$ post.php?P=$1

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

Я следовал этому:

The Rule:
RewriteRule ^user/(\w+)/?$ user.php?id=$1

Pattern to Match:
^              Beginning of Input
user/          The REQUEST_URI starts with the literal string "user/"
(\w+)          Capture any word characters, put in $1
/?             Optional trailing slash "/"
$              End of Input

Substitute with:
user.php?id=   Literal string to use.
$1             The first (capture) noted above.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Я думаю, что важно делиться такой информацией с другими, у которых может быть такая же проблема, так что здесь.

Проблема:

[1] Ссылка, которая выглядела так: www.example.com/news.php?P=1

Ссылка должна выглядеть как www.example.com/news/1

Тогда ссылка должна показывать текст вместо идентификатора. www.example.com/news/news-name

Решение

Во-первых, у меня были якорные теги, которые выглядели так

<a href="news.php?P='.$row['post_id'].'" class="btn btn-link"></a>

Это дало первый результат в URL [1]. Чтобы изменить его так, чтобы он выглядел как www.example.com/news/1, мне нужно было сделать следующее:

Создайте файл htaccess и заполните его следующим образом:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC]
### THIS IS AN EXAMPLE FOR MULTIPLE EXPRESSIONS ###
#RewriteRule ^news/([0-9]+)/([0-9a-zA-Z_-]+) news.php?P=$1&name=$2 [NC,L]

RewriteRule ^news/([0-9]+) news.php?P=$1 [NC,L]

А затем измените теги привязки на: <a href="news/'.$row['post_id'].'" class="btn btn-link"></a>

[1] Будет сделано сейчас.

Задача теперь заключалась в том, чтобы использовать слизень вместо идентификатора. На странице создания поста я добавил следующий PHP:

<?php
setlocale(LC_ALL, 'en_US.UTF8');
function slugit($str, $replace=array(), $delimiter='-') {
    if ( !empty($replace) ) {
        $str = str_replace((array)$replace, ' ', $str);
    }
    $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
    $clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
    $clean = strtolower(trim($clean, '-'));
    $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
    return $clean;
}
?>

Затем, на странице вставки новостей, я добавил: $slug = slugit("$entry1");, в котором в качестве заголовка страницы будет указано $entry1 = $_POST['title'];, но оно будет прервано. В базе данных новостей я создал столбец для размещения $slug в качестве имени постоянной ссылки.

Теперь, чтобы представить URL с слагом, мне пришлось изменить тег привязки на:

<a href="news/'.$row['permalink'].'" class="btn btn-link"></a>

А на htaccess измените RewriteRule ^news/([0-9]+) news.php?P=$1 [NC,L] на RewriteRule ^news/([0-9a-zA-Z_-]+) news.php?P=$1 [NC,L]

Вот так я и заставил его работать. Я надеюсь, что это поможет людям с похожими проблемами исправить их.

0 голосов
/ 05 сентября 2018

Попробуйте с ниже,

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^post/(\w+)$ post.php?P=$1 [L]
...