2017-02-19 19 views
1

Использование .htaccess Я хочу превратить% {PATH_INFO} в параметр строки запроса для начальной загрузки. Но я хочу, чтобы посетители не могли вручную ввести параметр начальной загрузки.Удалить определенный параметр строки запроса, ЕСЛИ он не был добавлен rewrite

Так что введен URL: www.example.com/user/pictures?id=65

На самом деле показывает: www.example.com?bootstrap=/user/pictures & ID = 65

НО, если ввести вручную

Это введенные URL: www.example.com?bootstrap=/user/pictures & я d = 65

Удаляет его: www.example.com?id=65

Или выводит сообщение об ошибке: 404: не найден

Лучший сценарий

вручную введенный bootstrap игнорируется, а% {PATH_INFO} становится новым параметром.

Так что это: www.example.com/user/pictures?id=65 & самозагрузки = somecrap

Дисплеи: www.example.com?id=65 & самозагрузки =/пользователь/фотографии

Существует две причины блокировки введенного вручную параметра начальной загрузки. 1) Безопасность. Мы не хотели бы, чтобы пользователи охотились и клевали файлы, не предназначенные для отображения. 2) Конфликты. Мы не хотим выбирать между введенным вручную бутстрапом и правильным% {PATH_INFO}.

Удаление параметра начальной загрузки легко. Что-то вроде ...

RewriteCond %{QUERY_STRING} ^(.*&)?bootstrap=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^%{REQUEST_URI}?%1%2 [L,NE] 

Добавление параметра очень просто. (Mine является более сложным, но это показывает идею.)

RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_URI}%{PATH_INFO} (.*?)(/.+)\2$ 
RewriteRule ^(.*)$ /%1?bootstrap=%2 [QSA,L] 

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

Я знаю, что быстрое решение n-dirty должно было бы добавить [END] ко второму правилу, но это не будет работать здесь.

Что мне нужно - это удалить? "Bootstrap = xxx" ТОЛЬКО от исходного запроса и НЕ от перезаписанного запроса.

Благодаря

ответ

3

признать, если это первоначальный запрос или нет, вы можете проверить некоторые REDIRECT_ переменные

REDIRECT_ environment variables are created from the environment variables which existed prior to the redirect. They are renamed with a REDIRECT_ prefix, i.e., HTTP_USER_AGENT becomes REDIRECT_HTTP_USER_AGENT .

REDIRECT_URL , REDIRECT_STATUS , and REDIRECT_QUERY_STRING are guaranteed to be set, and the other headers will be set only if they existed prior to the error condition.

Так что в вашем случае, вы можете проверить REDIRECT_STATUS или REDIRECT_QUERY_STRING, чтобы увидеть, если это внешнее или внутреннее запрос.

bootstrap= Удалить только, если это внешний запрос, т.е. REDIRECT_QUERY_STRING пуст

RewriteCond %{REDIRECT_QUERY_STRING} ^$ 
RewriteCond %{QUERY_STRING} ^(.*&)?bootstrap=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^%{REQUEST_URI}?%1%2 [L,NE] 

Другой путь будет похож, хотя теперь проверить, если переменные не является пустым, например,

RewriteCond %{REDIRECT_QUERY_STRING} . 
RewriteCond %{QUERY_STRING} ^(.*&)?bootstrap=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^%{REQUEST_URI}?%1%2 [L,NE] 

Вы также можете проверить конкретное значение, если это уместно.

+0

Очень хорошее использование 'REDIRECT_QUERY_STRING' ++ – anubhava

2

способ сделать это, чтобы установить переменные окружения на успешную перезапись, который вы можете сделать с E флагом.Так что-то вроде этого:

RewriteRule ^example$ ?param=example [E=rewritten:1] 

Вы можете проверить его в состоянии:

RewriteCond %{ENV:rewritten} !=1 

Или:

RewriteCond %{ENV:rewritten} =1 

Однако при использовании этого в .htaccess вы должны быть осторожны , потому что, если проход через файл .htaccess завершается и создается внутреннее перенаправление, любые генерируемые переменные среды получат REDIRECT_ preended t o их. Таким образом, для последующего проходит, вам также необходимо проверить, что в большинстве случаев, или просто для того, если ваши правила выше, где вы добавляете переменную окружения:

RewriteCond %{ENV:REDIRECT_rewritten} !=1 

Или:

RewriteCond %{ENV:REDIRECT_rewritten} =1 

Справка:

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

  • Нет связанных вопросов^_^