.htaccess mod-rewrite URL-адреса, заканчивающиеся на -XXXX (тире, цифры)

Я пытаюсь сопоставить URL-адреса, которые заканчиваются тире и набором чисел (или только одним числом), но не работает:

Пример: domain.com/my-product-36-inches-long-135355.

# rewrite urls
Options +SymLinksIfOwnerMatch +FollowSymLinks -Indexes
RewriteEngine On
RewriteBase /


# product 
RewriteRule ^shop/-([0-9,]+)/?$ product.php?url_key=$1 [NC,L]

# category
RewriteRule ^shop/([^/.]+)$ category.php?url_key=$1 [NC,L]

# sub category
RewriteRule ^shop/([^/.]+)/([^/.]+)$ subcategory.php?url_key=$1&url_key2=$2 [NC,L]

# list (from subcategory page; will have 3 variables)
RewriteRule ^shop/([^/.]+)/([^/.]+)/([^/.]+)$ list.php?mr=3&url_key1=$1&url_key2=$2&url_key3=$3 [NC,L]

# list (from category page; will have 4 variables)
RewriteRule ^shop/([^/.]+)/([^/.]+)/([^/.]+)/([^/.]+)$ list.php?mr=4&url_key1=$1&url_key2=$2&url_key3=$3&url_key4=$4 [NC,L]



# business types
RewriteRule ^shop/restaurant-supply-business-type section.php?id=1 [NC,L]

# login
RewriteRule ^shop/customer/account/login login.php [NC,L]

# brands
RewriteRule ^shop/shopby/brand brands.php [NC,L]

# professional services
RewriteRule ^shop/professional-services professional_services.php [NC,L]

# pages 
RewriteRule ^locations/([^/.]+)$  page.php?url_key=locations/$1 [NC,L]
RewriteRule ^locations page.php?url_key=locations [NC,L]
RewriteRule ^testimonials page.php?url_key=testimonials [NC,L]
RewriteRule ^contact-us page.php?url_key=contact-us [NC,L]
RewriteRule ^equipment-checklist page.php?url_key=equipment-checklist [NC,L]
RewriteRule ^shipping page.php?url_key=shipping [NC,L]
RewriteRule ^returns page.php?url_key=returns [NC,L]
RewriteRule ^lease-financing page.php?url_key=lease-financing [NC,L]
RewriteRule ^news page.php?url_key=news [NC,L]
RewriteRule ^advice page.php?url_key=advice [NC,L]
RewriteRule ^about-us page.php?url_key=about-us [NC,L]
RewriteRule ^careers page.php?url_key=careers [NC,L]
RewriteRule ^privacy page.php?url_key=privacy [NC,L]
RewriteRule ^terms-of-use page.php?url_key=terms-of-use [NC,L]
RewriteRule ^page/([^/.]+)$ page.php?url_key=$1 [NC,L]
RewriteRule ^section/([^/.]+)$ section.php?url_key=$1 [NC,L]


# Remove all .php extensions without interfering with .js or .css.
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !pagespeed
RewriteRule ^([^.]+?)/?$ $1.php [L]

# Remove index from url.
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d

# RewriteRule ^([^.]+?)/?$ index.php?$1 [L,QSA]

person ToddN    schedule 09.10.2017    source источник


Ответы (2)


Вы можете сопоставить только конечную часть, используя это правило:

RewriteRule ^shop/.*-([0-9,]+)/?$ product.php?url_key=$1 [NC,QSA,L]
person anubhava    schedule 09.10.2017
comment
Спасибо за ответ, но я не мог заставить его работать. Тот же 404 я получаю. Вот реальный пример URL-адреса, который не работает: /shop/fountain-jar-2-qt-22916 - person ToddN; 09.10.2017
comment
Обновил, чтобы показать все. У меня нет каталога магазина, он весь в корне. Моя проблема в том, что категория, подкатегория, список и продукт должны использовать /shop/. - person ToddN; 09.10.2017
comment
Пробовал, то же самое. Я как-то связан с тем, что это соответствует тому же, что и #category, как мне кажется. Я могу заставить #product работать с этим: RewriteRule ^shop/product/([^/.]+)$ product.php?url_key=$1 [NC,L] но мне нужно, чтобы он был только в /shop/ без /product/ в URL-адресе. - person ToddN; 09.10.2017
comment
Я считаю, что для /shop/fountain-jar-2-qt-22916 вы хотите, чтобы фактический внутренний URI был product.php?url_key=22916 ? example.com/product.php?url_key=22916 нормально работает? - person anubhava; 09.10.2017
comment
Да, но не так, как вы показали. Это url_key, поэтому example.com/product.php?url_key=the-key-assigned-to-a-sku-in-db-22916 работает правильно. - person ToddN; 09.10.2017
comment
Но это правило только переписывает его на example.com/product.php?url_key=22916 может ли это быть проблемой? - person anubhava; 09.10.2017
comment
Я думаю, вы правы, мне, вероятно, нужно переписать код на этой странице на _GET с SKU вместо url_key - person ToddN; 09.10.2017

Если вы хотите сопоставить конец uri, который содержит (-numbers или numbers), используйте только следующее:

RewriteRule ^shop/(.*)(-([0-9]+)|([0-9]+))$  product.php?url_key=$2 [R,L,NE]

Если (-числа или только одна цифра чисел), используйте следующее:

RewriteRule ^shop/(.*)(-([0-9]+)|\b[0-9]\b)$ product.php?url_key=$2 [R,L,NE]
person Mohammed Elhag    schedule 09.10.2017