RewriteRule, где Group может быть там или может не быть - PullRequest
1 голос
/ 17 мая 2019

Не могу подобрать правильные слова для названия и вопроса, но практически вы поймете вопрос.

У меня есть .htaccess file:

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 Ответ

1 голос
/ 17 мая 2019

Чтобы совпадать, когда указаны только первые два параметра URL, вам нужно сделать третий параметр URL необязательным .Например:

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

Префикс ?: в 3-й необязательной группе делает его не захватывающим, поэтому он не мешает обратной ссылке %3 -который остается значением параметра URL refer, который просто будет пустым, если параметр URL refer пропущен.

Однако это приведет к /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]
...