Переадресация

Обсуждение любых вопросов связанных с файлами конфигурации .htaccess

Переадресация

Сообщение Electron » Пн сен 24, 2018 3:42 pm

Помогите, пожалуйста, запилить переадресацию на 404, в общем ситуация такая, старый движок сайта никак не реагирует на хлам в ссылках, допустим продукт расположен по адресу:
https://site.ru/product/id/
но если до и после понаписать всякую фигню, страница продолжает нормально отображаться:
https://site.ru/test/test///product/id/test/test/
а нужно, чтобы она увела на 404 страницу, а работала только по адресу /product/id/
Правильные канониклы уже указал, но этого не достаточно, поисковики индексируют эту шляпу)
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Emilien » Пн сен 24, 2018 5:44 pm

Код: выделить все
RewriteCond %{REQUEST_URI} ^(.*?)/product/\d+/(.*)$
RewriteCond %1%2           .
RewriteRule ^ - [R=404]

Ставить выше остальных правил.
Emilien
Мл. Сержант
 
Сообщений: 75
Зарегистрирован: Чт дек 10, 2015 3:35 am
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Electron » Вт сен 25, 2018 9:11 am

Emilien писал(а):Код: выделить все
RewriteCond %{REQUEST_URI} ^(.*?)/product/\d+/(.*)$
RewriteCond %1%2 .
RewriteRule ^ - [R=404]
Ставить выше остальных правил.

Спасибо, но я не уточнил, что id - ЧПУ с любой буквой, цифрой или символом, заменил в регулярном d на точку, но код всё равно никак не отреагировал, или не совсем верно?

Плюс бывают такие ситуации: /product/test/test/product/test/product/id/, продукт выводится по последнему в ссылке, а нужно 404...

P.S. И нужен ли во второй строке такой большой отступ перед точкой?
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Emilien » Вт сен 25, 2018 10:39 am

Тогда там вместо \d нужно поставить [^/] - это любой символ кроме "/".
Во второй строке отступ может быть любой.
Код: выделить все
RewriteCond %{REQUEST_URI} ^(.*?)/product/[^/]+/(.*)$
RewriteCond %1%2           .
RewriteRule ^ - [R=404]


Во второй строке точкой проверяется что строка не пустая и в ней есть хотя бы один символ.
Это можно делать с помощью !^$ или !=""
Код: выделить все
RewriteCond %{REQUEST_URI} ^(.*?)/product/[^/]+/(.*)$
RewriteCond %1%2           !^$
RewriteRule ^ - [R=404]


Код: выделить все
RewriteCond %{REQUEST_URI} ^(.*?)/product/[^/]+/(.*)$
RewriteCond %1%2           !=""
RewriteRule ^ - [R=404]
Emilien
Мл. Сержант
 
Сообщений: 75
Зарегистрирован: Чт дек 10, 2015 3:35 am
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Electron » Ср сен 26, 2018 8:41 am

Вроде похоже на правду, спасибо!) Единственное отдаёт не стилизованную 404, а серверную, с чем это может быть связано? Дописал ErrorDocument 404 /404.html, не знаю правильно ли это со стороны СЕО)

Плюс заметил очередную свою недосказанность, бывает ещё ссылка на страницу отзывов, выглядит она так: /product/id/reviews/, следовательно данное слово после id нужно тоже как-то разрешить :)
Последний раз редактировалось Electron Ср сен 26, 2018 9:32 am, всего редактировалось 1 раз.
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Electron » Ср сен 26, 2018 9:05 am

Сложно сообразить короче, допустим для страниц категории нужно проверить ещё содержится ли слово offset и рядом число - это пагинация, offset10 - 10 страница

/category/id/

/category/id/offset_id/

А вот по обычным страницам вообще не понятно как сделать, все не перечислишь:
/auxpage_id/
/cart/
/register/
/checkout/

Но если в конце приписать /cart/test/, то тоже страница нормально грузится...
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Emilien » Ср сен 26, 2018 10:39 am

Свою страницу 404 указывают в ErrorDocument.
Главное выяснить как её вызывать в этом движке сайта.
Это может быть или отдельный файл вроде 404.php
Код: выделить все
ErrorDocument 404 /404.php

Или вызов index.php с какими-то дополнительными параметрами.
Код: выделить все
ErrorDocument 404 /index.php?_route_=404


/product/id/ и /product/id/reviews/
Код: выделить все
RewriteCond %{REQUEST_URI} ^(.*?)/product/[^/]+/(?:reviews/)?(.*)$
RewriteCond %1%2           !=""
RewriteRule ^ - [R=404]


/category/id/ и /category/id/offset10/
Код: выделить все
RewriteCond %{REQUEST_URI} ^(.*?)/category/[^/]+/(?:offset\d+/)?(.*)$
RewriteCond %1%2           !=""
RewriteRule ^ - [R=404]


/cart/ /register/ /checkout/ можно объединить в одно правило
Код: выделить все
RewriteCond %{REQUEST_URI} ^(.*?)/(?:cart|register|checkout)/(.*)$
RewriteCond %1%2           !=""
RewriteRule ^ - [R=404]
Emilien
Мл. Сержант
 
Сообщений: 75
Зарегистрирован: Чт дек 10, 2015 3:35 am
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Electron » Ср сен 26, 2018 11:16 am

Ого, шикарно, вроде работает как надо! Спасибо ещё раз!

Так будет правильно указать для /auxpage_id/, где id - чпу?

^(.*?)/(?:cart|register|checkout|auxpage_[^/])/(.*)$

Или бред написал?))
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Electron » Ср сен 26, 2018 11:38 am

На самом деле может и не стоит делать по страницам, ибо их много, просто полазив по сайту пару минут нашёл эти:

/auxpage_id/
/cart/
/checkout/
/register/
/myaccount/
/order_history/
/contact_info/
/address_book/
/address_editor/
/affiliate_balance/
/affiliate_settings/
/affiliate_money/
/affiliate_history/
/search/
/category_search/

А у одной и /order_history/offset10/ увидел, наверняка ещё где то есть своя пагинация))

А вот для /auxpage_id/ - правило бы наверное не помешало - ибо это созданные пользователями страницы, их порядком 30, и они будут добавляться снова :)

Типо того? ^(.*?)/auxpage_[^/]/(.*)$
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Emilien » Ср сен 26, 2018 11:53 am

Там в регулярке к [^/] ещё добавить квантификатор "+"
^(.*?)/auxpage_[^/]+/(.*)$

^(.*?)/(?:cart|register|checkout|auxpage_[^/]+)/(.*)$
Emilien
Мл. Сержант
 
Сообщений: 75
Зарегистрирован: Чт дек 10, 2015 3:35 am
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Electron » Ср сен 26, 2018 11:57 am

Отлично, работает, спасибо!
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Electron » Пт сен 28, 2018 9:34 am

Нашёл ещё одну ссылку, для страниц категорий (показать весь продукт):
/category/id/
/category/id/offset10/
/category/id/all/

Нужно разрешить all, не могу подогнать рабочий вариант, пробовал на подобии: ^(.*?)/category/[^/]+/(?:all|offset\d+)/(.*)$

Не подскажите?)
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Electron » Пт сен 28, 2018 9:46 am

Вот так вроде работает, но мне кажется здесь излишний код:

^(.*?)/category/[^/]+/(?:all+/|offset\d+/)?(.*)$

Мне кажется слеш можно как-то за скобки вынести, но не догнал как)
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Emilien » Пт сен 28, 2018 9:48 am

Код: выделить все
RewriteCond %{REQUEST_URI} ^(.*?)/category/[^/]+/(?:all/|offset\d+/)?(.*)$


Код: выделить все
RewriteCond %{REQUEST_URI} ^(.*?)/category/[^/]+/(?:(?:all|offset\d+)/)?(.*)$
Emilien
Мл. Сержант
 
Сообщений: 75
Зарегистрирован: Чт дек 10, 2015 3:35 am
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Electron » Пт сен 28, 2018 9:52 am

Получается никак и не вынесешь, быстро отвечаете, спасибо :)

Я думал получится примерно как тут:
^(.*?)/(?:cart|checkout|register|myaccount|search)/(.*)$

Что-то вроде:
^(.*?)/category/[^/]+/(?:all|offset\d+)/(.*)$
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Emilien » Пт сен 28, 2018 10:11 am

Electron писал(а):Что-то вроде:
^(.*?)/category/[^/]+/(?:all|offset\d+)/(.*)$

В таком виде нет проверки для /category/id/ без all или offset.
Так что нужно именно (?:all/|offset\d+/)? или (?:(?:all|offset\d+)/)?
Emilien
Мл. Сержант
 
Сообщений: 75
Зарегистрирован: Чт дек 10, 2015 3:35 am
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Electron » Пт сен 28, 2018 11:03 am

Ясно, спс :)
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Electron » Пт окт 05, 2018 9:52 am

Заметил ещё один косяк)) У страниц с отзывами оказывается тоже бывает пагинация:

/product/id/
/product/id/reviews/
/product/id/reviews/page2/

Это не работает(

^(.*?)/product/[^/]+/(?:reviews)+/(?:page\d+/)?(.*)$

Поможете? :)
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Emilien » Пт окт 05, 2018 11:35 am

^(.*?)/product/[^/]+/(?:reviews/(?:page\d+/)?)?(.*)$
Emilien
Мл. Сержант
 
Сообщений: 75
Зарегистрирован: Чт дек 10, 2015 3:35 am
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0

Сообщение Electron » Пт окт 05, 2018 11:38 am

Ох, сложно, очередной раз спасибо!)
Electron
Новоприбывший
 
Сообщений: 13
Зарегистрирован: Пн сен 24, 2018 3:36 pm
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0


Вернуться в Htaccess

Кто сейчас на форуме

Зарегистрированные пользователи: нет зарегистрированных пользователей

cron