Я использую правила перезаписи в 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 может оставаться пустым. Так что в этом случае имя kat_name не указывается. Второй параметр (prod_name) является обязательным. Первый является необязательным. Обычно у нас всегда есть и первый параметр. Но при поиске товара или в редких случаях его можно было оставить пустым.
Вы можете использовать необязательное сопоставление в группе без захвата:
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 - поэтому две косые черты перед футболкой (пустые между косыми чертами)
http://example.com/products//t-shirt
даст тот же результат, проверьте, потому что несколько /
преобразуются в один шаблон /
в RewriteRule
.
Теперь я сам нашел лучшее решение в Интернете, используя оператор * вместо +
Это также позволяет оставить значение пустым:
RewriteRule ^products/([a-zA-Z-]*)/([a-zA-Z-]+)$ /products.php?kat_name=$1&prod_name=$2
Хотелось бы, чтобы вы протестировали его, прежде чем публиковать. Это даст хороший 404
Что должно быть
kat_name
для/products//t-shirt
?