Категории форума

Плагин "usercategories" и проблема с "%2F" при переключении языка интерфейса сайта

проблема Cotonti + urleditor + language selector в связке с плагином структуры категорий пользователей, специализаций и навыков. Анализ и решение!


webitproff
webitproff • 09.02.2026 20:21 #1

Плагин "usercategories" и проблема с "%2F" при переключении языка интерфейса сайта
проблема Cotonti + urleditor + language selector в связке с плагином структуры категорий пользователей, специализаций и навыков.

att_964.webp

Хронология проблемы. 
файл частично public_html/.htaccess
 


################ Block spamers by IP address #######################
# https://httpd.apache.org/docs/2.4/howto/access.html

################ Cotonti Handy URLs for Apache #######################
# Below are the rules to be included in your main .htaccess file or httpd.conf
# Rewrite engine options
Options -Indexes
RewriteEngine On
RewriteBase "/"
# Language selector
RewriteRule ^(ru|en)/(.*) $2?l=$1 [QSA,NC,NE,DPI]
# .....
# users
RewriteRule ^customers/?$ index.php?e=users&group=customer [QSA,NC,NE,L]
RewriteRule ^contractors/?$ index.php?e=users&group=contractor [QSA,NC,NE,L]
RewriteRule ^customers/([a-zA-Z0-9_./%-]+)/?$ index.php?e=users&group=customer&cat=$1 [QSA,NC,NE,L]
RewriteRule ^contractors/([a-zA-Z0-9_./%-]+)/?$ index.php?e=users&group=contractor&cat=$1 [QSA,NC,NE,L]
# .....

 

дальше файл полностью 
public_html/plugins/urleditor/presets/marketplace.dat  


forums    m=posts&q=&d=    forums/{forums_url_structure()}/page{$d}
forums    m=posts&q=*    forums/{forums_url_structure()}
forums    m=posts&id=*    forums/{forums_url_structure()}
forums    m=topics&s=&d=    forums/{forums_url_structure()}/page{$d}{!$m}
forums    m=topics&s=*    forums/{forums_url_structure()}{!$m}
forums    c=*    forums/{$c}
forums    *    forums
page    m=*                        page?m={$m}
page    c=system&al=*            {$al}{!$c}
page    c=*&al=*                {cot_url_catpath()}/{$al}
page    c=*&id=*                {cot_url_catpath()}/{$id}
page    c=*                        {cot_url_catpath()}
index    *                        {$_path}
plug    e=tags&a=pages&t=*        {$e}/{$t}{!$a}
plug    e=tags&a=*&t=*            {$e}/{$a}/{$t}
plug    e=*                        {$e}
users    group=customer&cat=*            customers/{$cat}/{!$group}
users    group=contractor&cat=*            contractors/{$cat}/{!$group}
users    group=customer            customers/{!$group}
users    group=contractor            contractors/{!$group}
users    m=details&u=*            users/{cot_url_username()}
login    *                        {$_area}
message    *                        {$_area}
admin    m=*                        admin/{$m}
admin    *                        {$_area}
rss        m=*&c=*                    {$_area}/{$m}/{$c}
rss        m=*&id=*                {$_area}/{$m}/{$id}
rss        c=*                        {$_area}/{$c}
rss        m=*                        {$_area}/{$m}
*        c=*&al=*                {$_area}/{cot_url_catpath()}/{$al}
*        c=*&id=*                {$_area}/{cot_url_catpath()}/{$id}
*        c=*                        {$_area}/{cot_url_catpath()}
*        al=*                    {$_area}/{$al}
*        id=*                    {$_area}/{$id}
*        *                        {$_area}


Если мы находимся на странице https://siteoncotonti.com/ru/contractors/ (группа исполнители) мы легко можем переключиться на https://siteoncotonti.com/en/contractors/ кнопкой переключения языка интерефеса, и эти ссылки всегда корректно "подсвечиваются" при наведении на кнопки английского и русского языка сайта.
вот они в исходном коде браузера:

``` 
<div class="px-3">  
<a href="en/contractors/" class="selected mx-2"><img src="images/flags/gb.png" alt="gb"></a>  
<a href="ru/contractors/" class=" mx-2"><img src="images/flags/ru.png" alt="ru"></a>  
</div>
```

Но если зашли уже в категорию пользователей, https://siteoncotonti.com/en/contractors/websites/ то переключиться на русский не получается, где подставляется дополнительный слеш, и кнопки смены языка уже имеют вот такие ссылки в исходном коде браузера:

```
<div class="px-3">   
<a href="en/contractors/websites%2F/" class="selected mx-2"><img src="images/flags/gb.png" alt="gb"></a>  
<a href="ru/contractors/websites%2F/" class=" mx-2"><img src="images/flags/ru.png" alt="ru"></a>  
</div> 
```

вместо рабочей ссылки: https://siteoncotonti.com/ru/contractors/websites/  
нас отправляет на https://siteoncotonti.com/ru/contractors/websites%2F/  
и как результат:  

404 - Not Found
The requested object or URL was not found on this server.
The link you followed is either outdated, inaccurate, or the server has been instructed not to let you access the page.

как это исправить? проблема наблюдается именно, когда находимся внутри категорий плагина "usercategories".


Анализ и решение проблемы декодирования "%2F"

Суть проблемы (коротко и точно)

Проблема НЕ в .htaccess напрямую и НЕ в Apache.
Проблема в том, что плагин usercategories формирует cat со слешем в конце (websites/), а Cotonti при генерации ссылки переключения языка прогоняет путь через rawurlencode().

👉 / внутри параметра превращается в %2F
👉 дальше mod_rewrite НЕ декодирует %2F обратно в /
👉 итог: websites%2F/ → 404

 

Где именно ломается

На странице:

/en/contractors/websites/


внутренне формируется:

cat = "websites/"


При генерации ссылки языка получается:

en/contractors/websites%2F/


А правило:

RewriteRule ^(ru|en)/(.*) $2?l=$1


получает websites%2F/ как literal, Apache %2F не трогает → Cotonti не может сопоставить категорию → 404.

 

РЕШЕНИЕ №1 (ПРАВИЛЬНОЕ, РЕКОМЕНДУЕМОЕ)


❗ Убрать слеш из значения cat

Категория НЕ должна заканчиваться /.

Исправление в urleditor preset

Файл:

plugins/urleditor/presets/marketplace.dat

БЫЛО:

users    group=customer&cat=*            customers/{$cat}/{!$group}
users    group=contractor&cat=*            contractors/{$cat}/{!$group}

 

ДОЛЖНО БЫТЬ:

users    group=customer&cat=*            customers/{$cat}{!$group}
users    group=contractor&cat=*            contractors/{$cat}{!$group}


🔴 УБРАТЬ слеш после {$cat}

Обязательно Затем: очистить кеш Cotonti

 

Отредактировано: webitproff (09.02.2026 21:50, 5 месяцев назад)
1/1/0

🗿

🧙‍♂️ Радуйся, странниче добрый и честный! Не понапрасну привела тя стезя в земли сии. Зде бо мужи мудры и искусники дела писменнаго и численнаго, что куют словеса и плетут узоры кода, тайны разгадывают и знанием делятся, летописи множа и ремесло цифровое творя.
⬅️ Аще налево пойдеши — обрящеши грамоты древния, писания старинныя и свитки учения. ⬆️ Аще прямо — слово мудрое и совет от мужей разумеющих, что в деле кодописном искусны, получиши. ➡️ Аще направо — сам в писцы и летописцы внидеши, и в ремесло цифровое, где строки и знаки в дело живое обращаются, слово свое в память веков вложиши.
📝 Не медли же — нареки имя свое, и вниди в чин наш, и стань с нами в братстве, где код есть магия, а строки — заклятия живыя, числом и буквою слово едины суть.
🏰 Не тайно есть собрание сие, и не инициации в нем, но многое сокрыто от пришлых и ступалого, понеже не всякому открывается знание, но токмо ищущим и пребывающим в деле сем.

Рекомендуемые товары в этой теме

User Categories - категории пользователей и специализации

Плагин для Cotonti, который позволяет пользователям выбирать специализации, навыки и направления Модули и Плагины для Cotonti

Плагин Userfields для CMF Cotonti 0.9.26

Дополнительные поля профиля пользователя, выводим где угодно на сайте в любых шаблонах сайта: список Модули и Плагины для Cotonti