Является ли мой код mod-rewrite правильным?

Я хотел бы сделать следующее:

Запрос:

http://www.mydomain.com/show/requested/path/here?some=var&some_other=var

shoud будет отправлен

index.php?s=show/requested/path/here&some=var&some_other=var

(последние 3 строки моего кода, я думаю, что они верны, насколько я знаю)

если пользователь пытается отправить var с именем "s" через запрос на получение, он должен быть перенаправлен на

index.php?s=error

то есть:

  • http://www.mydomain.com/show/requested/path/here?s=var
  • http://www.mydomain.com/show/requested/path/here?a=b&s=var
  • http://www.mydomain.com/show/requested/path/here?a=b&s=var&c=d
  • http://www.mydomain.com/show/requested/path/here?a=b&s
  • http://www.mydomain.com/show/requested/path/here?s

Мой вопрос: правилен ли следующий код? это похоже на 5 случаев. Но я не знаю, соответствует ли он другим случаям, которые он не должен. Моя цель состоит в том, чтобы не разрешать отправку var с именем "s" через запрос получения.

Содержимое моего.htaccess:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.*)(\?|&)s=?(.*)$ [NC]
RewriteRule ^(.*)$ index.php?s=error [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?s=$1 [L,QSA]
1 ответ

Нет, это не так, потому что ваше второе правило будет вводить ?s=... в URL-адрес запроса и будет соответствовать первому правилу во втором проходе и приведет к ошибке "? S =.

Замените код следующим образом:

RewriteCond %{QUERY_STRING} !(^|&)s=error(&|$) [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+.*?[?&]s\b [NC]
RewriteRule ^ index.php?s=error [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} !(^|&)s=[^&]+(&|$) [NC]
RewriteRule ^(.+)$ index.php?s=$1 [L,QSA]

Обратите внимание на использование %{THE_REQUEST} который представляет собой исходный запрос и не изменяется с применением различных правил перезаписи.

licensed under cc by-sa 3.0 with attribution.