Удалить символы из URL с htaccess

надеюсь, кто-то может увидеть, что я делаю неправильно, но вот история...

мой текущий URL-адрес сайта автоматически генерируется программным обеспечением электронной коммерции из имен продуктов и категорий, поэтому, если имя продукта/категории включает не буквенно-цифровой символ, это кодируется в URL-адресе, который является болью. Например:

mysite.com/Shop/Furniture-Set-Large-Table%2C-4-Chairs.html

Я перехожу к новому решению электронной коммерции, которое также автоматически генерирует URL-адреса из названия продукта, но достаточно умно, чтобы удалить все неалфавитные символы. Он также преобразует в нижний регистр, который мне удалось найти решение htaccess для перенаправления верхнего регистра в нижний регистр. Он также не имеет "магазин" часть URL, который мне также удалось решить с помощью htaccess. Например:

mysite.com/furniture-set-large-table-4-chairs.html

чтобы удалить часть "магазин":

RedirectMatch 301 ^/Shop/(.*)$ http://www.mysite.com/

чтобы заменить верхний регистр на нижний, чтобы предотвратить ошибку 404:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteCond %{REQUEST_FILENAME} !.(?:png|gif|ico|swf|jpg|jpeg|js|css|php|pdf)$
RewriteRule (.*) ${lc:http://www.mysite.com/} [R=301,L]

они оба работают отлично.

поэтому мне нужно правило htaccess, или возможно несколько, чтобы удалить эти закодированные символы из URL. Мне не нужно их заменять, просто удалите их, потому что программное обеспечение создает URL-адрес как "таблица%2C-4 - стулья" - поэтому необходимо удалить только %2C.

мне нужно удалить определенные кодировки символов из URL, такие как:

запятая (%2C), Апостроф (%27), двоеточие (%3A) и т. д.

может ли кто-нибудь посоветовать подходящее правило htaccess или правила для этого?

спасибо заранее.

1 ответов


URI url-декодируется перед отправкой через механизм перезаписи, поэтому вы хотите сопоставить фактические символы, а не их закодированные аналоги:

RewriteRule ^(.*),(.*)$ / [L]
RewriteRule ^(.*):(.*)$ / [L]
RewriteRule ^(.*)\'(.*)$ / [L]
RewriteRule ^(.*)\"(.*)$ / [L]
# etc...

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^(.*)$ http://www.mysite.com/ [L,R=301]

статус перенаправления позволяет mod переписать знать, что если какое-либо из вышеуказанных правил было применено (таким образом, внутреннее значение статуса перенаправления = 200), нам нужно перенаправить, но мы не достигнем этой части правил, пока не очистим все специальные проверки символов.

вы бы хотели, чтобы эти правила все до любой из переадресаций, так что правила могут цикл и удалить несколько экземпляров любого из этих символов. Затем, когда больше нет специальных символов, механизм перезаписи может просочиться туда, где находятся ваши перенаправления.

Я бы предложил вам удалить mod_alias RedirectMatch директива и замените ее правилом перезаписи. Иногда объединение 2 модулей и оба из них влияют на один URI может привести к неожиданным результатам. так что до все вышеперечисленные правила, вы бы:

RewriteRule ^Shop/(.*)$ / [L]

добавление удаление /Shop/ в цепочке специальных символов. Тогда последует твое последнее правило:--6-->

RewriteCond %{REQUEST_URI} [A-Z]
RewriteCond %{REQUEST_FILENAME} !\.(?:png|gif|ico|swf|jpg|jpeg|js|css|php|pdf)$
RewriteRule (.*) ${lc:http://www.mysite.com/} [R=301,L]