Как я могу определить правило перезаписи, чтобы принимать также пустую строку в дополнение к a-zA-Z-?

Я использую правила перезаписи в htaccess для определения конкретных строк, которые при размещении в URL-адресе открывают определенные страницы.

например в данном случае название категории и название продукта

RewriteRule ^products/([a-zA-Z-]+)/([a-zA-Z-]+)$        /products.php?kat_name=$1&prod_name=$2

Поэтому, когда задан URL-адрес, например. /products/shirts/t-shirt все работает отлично. Но когда URL равен /products//t-shirt, правило не работает из-за пустой строки после первой косой черты.

Как я могу изменить свое правило, чтобы принимать также пустой шаблон после первой косой черты?

Извините, я не очень хорошо знаком с правилами перезаписи.

Спасибо и всего наилучшего

Что должно быть kat_name для /products//t-shirt ?

anubhava 10.12.2020 15:56

kat_name может оставаться пустым. Так что в этом случае имя kat_name не указывается. Второй параметр (prod_name) является обязательным. Первый является необязательным. Обычно у нас всегда есть и первый параметр. Но при поиске товара или в редких случаях его можно было оставить пустым.

cypher75 10.12.2020 16:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
373
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать необязательное сопоставление в группе без захвата:

Options -MultiViews
RewriteEngine On

RewriteRule ^products/(?:([a-z-]+)/)?([a-z-]+)/?$ products.php?kat_name=$1&prod_name=$2 [L,QSA,NC]

Это будут следующие матчи:

  • /products/shirts/t-shirt => $_GET:
    [kat_name] => shirts
    [prod_name] => t-shirt
  • /products//t-shirt => $_GET:
    [kat_name] => 
    [prod_name] => t-shirt

Хорошо, я понимаю, может быть, я сделал ошибку в объяснении. Из ваших двух примеров второй будет выглядеть так: /products//t-shirt - поэтому две косые черты перед футболкой (пустые между косыми чертами)

cypher75 10.12.2020 16:23
http://example.com/products//t-shirt даст тот же результат, проверьте, потому что несколько / преобразуются в один шаблон / в RewriteRule.
anubhava 10.12.2020 16:26
Ответ принят как подходящий

Теперь я сам нашел лучшее решение в Интернете, используя оператор * вместо +

Это также позволяет оставить значение пустым:

RewriteRule ^products/([a-zA-Z-]*)/([a-zA-Z-]+)$        /products.php?kat_name=$1&prod_name=$2

Хотелось бы, чтобы вы протестировали его, прежде чем публиковать. Это даст хороший 404

anubhava 11.12.2020 08:31

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

Похожие вопросы

Извлечение всех строк на основе двух столбцов с использованием Regex в postgresql
Почему производительность двух регулярных выражений, использующих группы захвата, сильно различается?
Вытащите студентов, которые получили B в файле, используя регулярное выражение
Очистка телефонных номеров с помощью регулярных выражений
Разделение строки с помощью вложенных скобок только на верхнем уровне, где «уровень» определяется скобками
Ansible regex_search со списком
Как найти добавление номера дома (в адресе) с помощью регулярного выражения
Регулярное выражение для строки с тегами
Как мне проверить полный формат строки, используя регулярное выражение в JavaScript?
Регулярное выражение для игнорирования нескольких префиксов и сопоставления только в том случае, если у них нет одного или двух конкретных жестко запрограммированных атрибутов?