我有以下规则:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule materia/([^/]+)/?$ article.php?slug=$1 [QSA,NC]
RewriteRule busca/?s=([^/]+) search.php?s=$1 [QSA,NC]
RewriteRule ^([^/]+)/?$ index.php?slug=$1 [QSA,NC]
</IfModule>
但是当URL类似于http://website.test/busca/?s=teste
时,第二个重写规则未应用htaccess测试人员:https://htaccess.madewithlove.be?share=28e2b25d-f6ef-5faa-a5c6-a412a87d5523
答案 0 :(得分:1)
这里有几个错误:
要匹配查询字符串(?s=xxx
),则需要在RewriteCond
上使用%{QUERY_STRING}
RewriteCond
范围仅用于下一个规则 。对于您而言,它只会检查第一条规则是否不是现有的文件夹/文件。
在每个规则之后使用L
标志,除非您知道自己在做什么。
使用RewriteBase
或绝对路径。
QSA
标志。它所做的只是将查询字符串(在重写之前)附加到重写目标。
多合一,这就是您的规则的外观
RewriteEngine On
# Don't touch existing folders/files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^materia/([^/]+)/?$ /article.php?slug=$1 [L,NC]
RewriteCond %{QUERY_STRING} ^s= [NC]
RewriteRule ^busca/?$ /search.php [L,QSA,NC]
RewriteRule ^([^/]+)/?$ /index.php?slug=$1 [L]