http RewriteCond和RewriteRule

时间:2012-02-16 10:33:26

标签: mod-rewrite

我需要像 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 个答案:

答案 0 :(得分:1)

  • %{REQUEST_URI}一开始就有一个/。所以RewriteCond %{REQUEST_URI} ^search.php永远不会匹配。

  • RewriteRule Directive

      

    Pattern是perl兼容的正则表达式。在第一个RewriteRule上,它应用于请求的(%-decoded)URL路径;后续模式应用于最后匹配的RewriteRule的输出。

  • ?表示未转义时匹配前一个字符中的一个或不匹配。因此,^search.php?q=...符合:

    • search.phpq=...
    • search.phq=...

来自PCRE man pages

  

?扩展了(的含义)                   还有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]