Специальные символы в параметре GET с правилами htaccess - PullRequest
0 голосов
/ 07 июня 2019

Мои правила создаются с помощью бесплатных онлайн-инструментов.Они работают нормально, пока некоторые из специальных символов, таких как & / - , не появятся в url в качестве параметра GET.Я хочу получить чистую и оптимизированную для SEO ссылку.

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

Как обрабатывать специальные символы, такие как & и / в правилах .htaccess?

Параметр GET не работает с правилами htaccess

... и многие другие ответы.

Мой htaccess

RewriteEngine On
RewriteRule ^all-books$ /bookIndex.php [L]
RewriteRule ^year/([^/]*)$ /bookIndex.php?year=$1 [L]
RewriteRule ^find-by-first-letter/([^/]*)$ /bookIndex.php?letter=$1 [L]
RewriteRule ^books-online/([^/]*)/about-book$ /book.php?book=$1 [L]

Вот как я его использую.

Страницы и коды:

page: https://example.com/bookIndex.php 
url / a href: https://example.com/all-books
Rule: `RewriteRule ^all-books$ /bookIndex.php [L]`

та же страница с параметрами GET

url: https://example.com/year/[YEAR HERE]
link: echo "<a href=\"https://example.com/year/".$row["year"]."\">".$row["year"]."</a>";
Rule: RewriteRule ^year/([^/]*)$ /bookIndex.php?year=$1 [L]

url: https://example.com/find-by-first-letter/[FIRST LETTER HERE]
link: echo "<a href=\"https://example.com/find-by-first-letter/".$row1["letter"]."\">".$row1["letter"]."</a>";
Rule: RewriteRule ^find-by-first-letter/([^/]*)$ /bookIndex.php?letter=$1 [L]

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

Страница и коды, где проблема

page: https://example.com/book.php 
url: https://example.com/books-online/[TITLE HERE]/about-book
link: <a href=\"https://example.com/books-online/".str_replace(' ', '-', $row2['title'])."/about-book\">".$row2['title']."</a>
RewriteRule ^books-online/([^/]*)/about-book$ /book.php?book=$1 [L]

Если $row2['title'] = "Книга" `все работает нормально, но в следующих случаях

$row2['title'] = "K-9000"
$row2['title'] = "24/7"
$row2['title'] = "You & Me"

Я получаю сообщение об ошибке «Страница перенаправляется неправильно» в браузере.Я понятия не имею, почему rexeg из других ответов не работает, мне нужно RewriteCond% {QUERY_STRING} ?

А как насчет моего способа изменения пробелов в url в "-" с помощью str_replace(' ', '-', $row2['title'])>?

Я уверен, что теперь это был неправильный путь, потому что мне нужно изменить пробелы обратно, чтобы получить исходный заголовок для базы данных поиска, в то время как заголовок может быть " K-9000", я не получу никакого результата.

Должен ли я использовать htaccess для этого, верно?

1 Ответ

1 голос
/ 07 июня 2019

Используемой вами дезинфекции str_replace(' ', '-', ...) недостаточно, вам следует использовать другую улучшенную очистку. Я создал следующую функцию для очистки заголовка, она заменит все не алфавитно-цифровые символы с тире:

/**
 * Replace all not non-alphanumeric characters with dashes
 *
 * @var string $title
 * @return string
 */
function sanitize_title(string $title) {
    $title = strtolower($title);
    $title = str_replace('&', 'and', $title);
    $title = preg_replace('/([^a-z0-9]+)/', '-', $title);
    $title = trim($title, '-');
    return $title;
}

Тогда при печати ссылка:

<a href="https://example.com/books-online/" . sanitize_title($row2['title']) . "/about-book">".$row2['title']."</a>

Примеры:

One Hundred Years of Solitude: one-hundred-years-of-solitude
       Breakfast at Tiffany's: breakfast-at-tiffany-s
                     Catch-22: catch-22
             Carry On, Jeeves: carry-on-jeeves
            Man & His Symbols: man-and-his-symbols
                  I, Claudius: i-claudius
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...