%{REQUEST_URI}
всегда имеет /
в начале.поэтому RewriteCond %{REQUEST_URI} ^search.php
никогда не будет совпадать.
Директива RewriteRule
Шаблон - это совместимое с perl регулярное выражение.В первом RewriteRule он применяется к (% -декодированному) URL-пути запроса;последующие шаблоны применяются к выходу последнего соответствующего RewriteRule.
?
означает совпадение для одного или ни одного из предыдущих символов, если не экранировано.Таким образом, ваш ^search.php?q=...
будет соответствовать:
search.phpq=...
search.phq=...
от Справочные страницы PCRE
?расширяет значение (также 0 или 1 квантификатор также минимизатор квантификатора
Вам нужно будет сделать это:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_URI} ^/([\w]+)/?$ [NC]
RewriteRule ^ search.php?q=%1 [L,QSA]
RewriteCond %{REQUEST_URI} ^/search.php [NC]
RewriteCond %{QUERY_STRING} ^q=([\w\d-]+)$ [NC]
RewriteRule ^ /%1? [L,R=301]