Правило перезаписи htaccess, дружественное к SEO, не работает

Я хочу изменить этот URL:

example.com/services-details.php?service_id=1

К:

example.com/services-details/1

Вот код файла .htaccess

Options +FollowSymLinks -MultiViews
RewriteEngine On

#SEO FRIENDLY URL

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)$ services-details.php?service_id=$1

Обновление (исправлено)

Шаг 1: Добавьте этот код в свой файл .htaccess

Options +FollowSymLinks -MultiViews
RewriteEngine On

# SEO FRIENDLY URL

# Redirect "/services-details.php?service_id=<num>" to "/services-details/<num>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^service_id=(\d+)$
RewriteRule ^(services-details)\.php$ /$1/%1 [QSD,R=301,L]

# Rewrite "/services-details/<num>" back to "services-details.php?service_id=<num>"
RewriteRule ^(services-details)/(\d+)$ $1.php?service_id=$2 [L]

Шаг 2: Добавьте этот код (вверху) внутри HTML-элемента `.

<base href="/">

После следующих шагов он должен работать.

Информация

Не забудьте изменить название ссылки services-details!

Куда вы кладете файл .htaccess? Какие значения может принимать service_id? Только числовое?

MrWhite 23.04.2022 10:43

@MrWhite — файл .htaccess находится в файле public_html сервера. идентификатор службы может принимать значения только в виде числового (int) примера: services-details.php?service_id=12.

Bilal Ozturk 23.04.2022 15:56

«когда я нажимаю на одну из опций службы» - извините, вам нужен флаг QSD в правиле перенаправления (я обновил свой ответ). Однако вы уже должны делать внутренние ссылки на /services-details/1, а не на /services-details.php?service_id=1. (.htaccess сам по себе не меняет ваши URL-адреса.)

MrWhite 23.04.2022 17:12

@MrWhite Я обновил код, но теперь вижу только пустую страницу (404), знаете почему? Я также обновил вопрос, чтобы дать больше информации об этом.

Bilal Ozturk 23.04.2022 17:52

У вас в обновлении только половина кода?! Вам нужно как переписать (первое правило в моем ответе), так и второе правило (которое у вас есть выше, хотя это необязательно).

MrWhite 23.04.2022 18:08

@MrWhite спасибо, это работает. Осталась только одна проблема: когда я хочу посетить домашнюю страницу (index.php), она перенаправляется на: example.com/services-details/index.php. Обычно он должен перенаправлять на: example.com/index.php. И когда я хочу посетить другую страницу со сведениями об услуге, пример: example.com/services-details/1 to service-details/2, отправляет меня на: example.com/services-details/services-details.php?service_id‌​= 2

Bilal Ozturk 23.04.2022 18:11

Это не имеет ничего общего с этими правилами как таковыми. Похоже, вы используете относительный URL-адрес для ссылки на свою домашнюю страницу. Поскольку страница теперь находится на другой глубине пути, любой относительный URL-адрес будет разрешен относительно текущего URL-пути, т.е. /services-details/. См. следующий вопрос в стеке веб-мастеров (применяется тот же принцип): webmasters.stackexchange.com/questions/86450/…

MrWhite 23.04.2022 18:17

@MrWhite Спасибо за вашу помощь, полные решения. Это сработало после того, как я добавил <base href="/">. Надеюсь, это может помочь другим людям!

Bilal Ozturk 23.04.2022 18:28
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
8
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
RewriteRule ^([a-zA-Z0-9_-]+)$ services-details.php?service_id=$1

RewriteRuleшаблон (т.е. ^([a-zA-Z0-9_-]+)$) соответствует только одному сегменту пути, тогда как запрошенный URL имеет два, т.е. /services-details/1 - нужно соответствовать service-details.

И я предполагаю, что service_id всегда числовое.

Например:

Options +FollowSymLinks -MultiViews
RewriteEngine On

# SEO FRIENDLY URL

RewriteRule ^(services-details)/(\d+)$ $1.php?service_id=$2 [L]

Поскольку вы переписываете одно и то же, вы также можете захватить service-details, чтобы избежать повторения.

Казалось бы, нет необходимости в проверках файловой системы, поскольку я не думаю, что /services-details/<number> соответствует файлу или каталогу?


Обратите внимание, что если вы являетесь изменение существующей структурой URL-адресов, в которой старые URL-адреса были проиндексированы поисковыми системами или на которые ссылались третьи стороны, вам также следует реализовать перенаправление 301 со старого URL-адреса (т. е. /services-details.php?service_id=<number>) на новый URL-адрес (т. е. /services-details/<number>) для сохранения SEO.

Например, следующее «перенаправление» должно пройти до существующей «перезаписи» (см. выше):

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^service_id=(\d+)$
RewriteRule ^(services-details)\.php$ /$1/%1 [QSD,R=301,L]

Флаг QSD необходим для удаления исходной строки запроса из ответа перенаправления.

Резюме

Ваш файл .htaccess должен выглядеть так с объединенными правилами:

Options +FollowSymLinks -MultiViews
RewriteEngine On

# SEO FRIENDLY URL

# Redirect "/services-details.php?service_id=<num>" to "/services-details/<num>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^service_id=(\d+)$
RewriteRule ^(services-details)\.php$ /$1/%1 [QSD,R=301,L]

# Rewrite "/services-details/<num>" back to "services-details.php?service_id=<num>"
RewriteRule ^(services-details)/(\d+)$ $1.php?service_id=$2 [L]

@BilalOzturk Вы можете изменить существующие правила, добавив дополнительный параметр. (Или продублируйте, если вам нужно и то, и другое.) Это оставлено в качестве упражнения для читателя ;). Возвращайся, если застрянешь. Если есть что-то, что вы не понимаете в директивах, которые я опубликовал, пожалуйста, спросите. Документы Apache по mod_rewrite — хороший источник информации: Вступление и Справка.

MrWhite 24.04.2022 01:40

Другие вопросы по теме