标题和问题的措词不正确,但实际上您会理解该问题。
我有 .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
答案 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]