我需要像 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
答案 0 :(得分:1)
%{REQUEST_URI}
一开始就有一个/
。所以RewriteCond %{REQUEST_URI} ^search.php
永远不会匹配。
Pattern是perl兼容的正则表达式。在第一个RewriteRule上,它应用于请求的(%-decoded)URL路径;后续模式应用于最后匹配的RewriteRule的输出。
?
表示未转义时匹配前一个字符中的一个或不匹配。因此,^search.php?q=...
符合:
search.phpq=...
search.phq=...
?扩展了(的含义) 还有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]
NC
(nocase):flag_nc Apache Docs L
(最后):flag_l Apache Docs