组中可能存在或可能不存在的RewriteRule

时间:2019-05-17 08:44:44

标签: apache .htaccess mod-rewrite url-rewriting

标题和问题的措词不正确,但实际上您会理解该问题。

我有 .htaccess 个文件:

Options -MultiViews
RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^user=([A-Za-z0-9]+={0,2})&quiz=([A-Za-z0-9-]+)&refer=([A-Za-z0-9-]+)
RewriteRule ^(quiz)\.php$ /college/$1/%1/%2/%3 [QSD,R=302,L]

RewriteRule    ^quiz/?$    quiz.php    [L]
RewriteRule ^quiz/([A-Za-z0-9]+={0,2})/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ quiz.php?user=$1&quiz=$2&refer=$3    [L]

现在,当我请求http://localhost/college/quiz.php?user=MTA&quiz=238&refer=jitu时,

它更改为http://localhost/college/quiz/MTA/238/jitu

这与预期的结果相同

但是

当我请求http://localhost/college/quiz.php?user=MTA&quiz=238时,它保持不变。即: http://localhost/college/quiz.php?user=MTA&quiz=238 。我的 期望 是:

  

http://localhost/college/quiz/MTA/238

1 个答案:

答案 0 :(得分:1)

为了在仅提供前两个URL参数时进行匹配,您需要将第三个URL参数设为可选。例如:

RewriteCond %{QUERY_STRING} ^user=([A-Za-z0-9]+={0,2})&quiz=([A-Za-z0-9-]+)(?:&refer=([A-Za-z0-9-]+))?

第三个 optional 组上的?:前缀使其不被捕获,这样就不会干扰%3的反向引用-仍然保留为refer URL参数的 value ,当省略refer URL参数时,该值将为空。

但是,这将导致/college/quiz/MTA/238/(带有斜杠),而不是/college/quiz/MTA/238-如您的示例。但这将确保它仍然与以后的重写匹配。但是,您将需要在重写中更改相应的匹配组,以匹配0个或多个字符(即*量词),而不是当前的1个或多个字符(即+)。即。将([A-Za-z0-9-]+)/?$更改为([A-Za-z0-9-]*)/?$

RewriteRule ^quiz/([A-Za-z0-9]+={0,2})/([A-Za-z0-9-]+)/([A-Za-z0-9-]*)/?$ quiz.php?user=$1&quiz=$2&refer=$3    [L]