#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.
.*
такой же, как.*
здесь