Почему Firefox по-разному обрабатывает urlencode с флагом apache mod-rewrite B?

Недавно я столкнулся со странной проблемой, связанной с urlencode, у меня, как оказалось, "+" в обеих частях pathinfo и строки запроса.

Например:

http://example.com/A + B?s=C + D

Я использую tamperdata в firefox и могу убедиться, что thant firefox закодировал URL в следующее:

http://example.com/A%20+%20B?s=C%20+%20D

В то время как на стороне сервера, я переписал apache url включен со следующей инструкцией:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Затем в php я получил следующее:

$_REQUEST['q'] = 'A   B';
$_REQUEST['s'] = 'C   D';
$_SERVER['QUERY_STRING'] = 'q=A + B&s=C%20+%20D';

Как мы знаем, php будет автоматически использовать urldecode для разбора строки запроса на супер переменную $_REQUEST, что объясняет, почему "A + B" стало "A B", а "C + D" стало "C D". Затем я обновляю этот apache Перезапись URL должна декодировать все символы, чтобы выполнить сопоставление переписывания. ФЛАГ B поможет повторно закодировать их после сопоставления. Таким образом, правила переписывания стали следующими с применением B FLAG.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [B,L,QSA]

Затем результат стал:

$_REQUEST['q'] = 'A + B';
$_REQUEST['s'] = 'C   D';
$_SERVER['QUERY_STRING'] = 'q=A+%2B+B&s=C%20+%20D';

Что я ожидал, так это следующее:

$_SERVER['QUERY_STRING'] = 'q=A%20+%20B&s=C%20+%20D';

Затем я мог бы использовать rawurldecode вручную разобрать строку запроса следующим образом, также, как первоначально Firefox

$_REQUEST['q'] = 'A + B';
$_REQUEST['s'] = 'C + D';

Но вместо этого apache mod-rewrite B glag make q стал 'A+%2B+B', что отличается от оригинальной кодировки Firefox 'A%20+%20B'. Конечно, кодирование apache совместимо с функцией php urlencode.

Поэтому вопрос в том, почему Firefox и Apache ведут себя так по-разному? Почему Firefox не кодирует "A + B" в "A +% 2B + B" как обычное использование, а "A% 20 +% 20", что приводит к тому, что многие из них несовместимы с PHP а на стороне сервера?

0 ответов

Другие вопросы по тегам