Переписать URL условно и сделать все в нижнем регистре

#apache #.htaccess #mod-rewrite #url-rewriting

#apache #.htaccess #мод-переписать #url-переписывание

Вопрос:

Итак, у меня есть URL-адреса, подобные этому: https://foobar.com/blog?category=Foo Bar , где фактическое значение параметра get может содержать или не содержать символ плюс ( ).

То, что я пытаюсь сделать, это сначала сделать значение параметра строчным во всех случаях, а затем, если значение параметра содержит символ плюс ( ), заменить его дефисом.

В конце концов, я пытаюсь https://foobar.com/blog?category=Foo Bar переписать в https://foobar.com/category/foo-bar

Это то, что я получил до сих пор:

 Options  FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_URI} ^/blog
RewriteCond %{QUERY_STRING} category=([^/] ) ([^/] )$
RewriteRule (.*) /category/%1-%2? [R=301,L]
  

Теперь это несколько близко, но на самом деле он перезаписывается https://foobar.com/blog?category=Foo Bar https://foobar.com/category/Foo Ba-r .

Любая помощь будет высоко оценена.

Комментарии:

1. Для нижнего регистра см. serverfault.com/questions/777577 /…

Ответ №1:

Пожалуйста, добавьте RewriteMap lc int:tolower наконец свой файл htaccess или в свой <VirtualHost> раздел. Не могли бы вы, пожалуйста, попробовать следовать тогда.

 RewriteEngine On
RewriteCond https on
RewriteCond %{REQUEST_URI} ^/blog$ [NC]
RewriteCond %{QUERY_STRING} ^([^=]*)=([^ ]*) (.*)$ 
RewriteRule ^(.*)$ /%1/${lc:%2}-${lc:%3}   [QSD,R=301,L]
  

Тестирование с curl помощью команды (с http, но правило выше заботится о https части):

 curl -IL "http://localhost:80/blog?category=Foo Bar"
HTTP/1.1 301 Moved Permanently
Server: Apache/2.4.46 (Win64) OpenSSL/1.1.1g PHP/7.4.11
Location: http://localhost/category/foo-bar
  

Комментарии:

1. внес незначительные изменения в него: RewriteCond %{QUERY_STRING} category=([^ ]*) (.* )$

2. @Milos, извините, не видел этого, не могли бы вы проверить это сейчас, если это вам поможет?

3. .* такой же, как .* здесь