Почему 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 а на стороне сервера?