未应用RewriteRule

时间:2018-07-23 12:51:40

标签: php .htaccess mod-rewrite

我有以下规则:

<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

1 个答案:

答案 0 :(得分:1)

这里有几个错误:

  1. 要匹配查询字符串?s=xxx),则需要在RewriteCond上使用%{QUERY_STRING}

  2. RewriteCond范围仅用于下一个规则 。对于您而言,它只会检查第一条规则是否不是现有的文件夹/文件。

  3. 在每个规则之后使用L标志,除非您知道自己在做什么。

  4. 使用RewriteBase或绝对路径。

  5. 手动重写 查询字符串时,不需要
  6. 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]