http RewriteCond и RewriteRule - PullRequest
       2

http RewriteCond и RewriteRule

0 голосов
/ 16 февраля 2012

Мне нужно переписать URL, например, http://www.example.com/search.php?abc на http://www.example.com/abc, используя приведенные ниже правила, но это не работает, почему не совпадает?

RewriteCond %{REQUEST_URI} ^search.php
RewriteRule ^search.php?q=([-0-9a-zA-Z]+) $1

1 Ответ

1 голос
/ 16 февраля 2012
  • %{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]

...