2013-09-02 2 views
1

Я хотел бы сделать следующее:Является ли мой код mod-rewrite правильным?

Запрос:

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

Шоуда направляются

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

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

если пользователь пытается t о отправить вар с именем "с" с помощью запроса GET он должен быть направлен на

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 запроса, и это будет соответствовать первому правилу во 2-ом проходе и приведет к `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}, который представляет первоначальный запрос и не меняется с применением различных правил перезаписи.

+0

Хммм, я получил очень серьезные результаты с вашим решением. Если я удалю R = 301, это сработает. Мой .htaccess не находится непосредственно в документе, как я объяснил, но я несколько ниже. Если я использую 301, он пытается перенаправить на абсолютный путь моего vm/var/www/..... – steven

+0

Упс, у меня была опечатка в моем первом правиле, которое я сейчас исправил. Пожалуйста, попробуйте еще раз. – anubhava

+0

теперь я могу переписать путь с помощью s = someting в get vars. – steven

Смежные вопросы