У меня есть правило перезаписи в .htaccess
RewriteRule ^page/(.*)$ my-php-page.php?cid=$1
Я передаю закодированную строку, которая содержит символы типа =
и +
– это закодированная строка;
V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
Когда в полном URL-адресе
http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
теперь это не работает из-за знака +
. Поэтому я хочу отправить cid
urlencoded, который затем станет;
http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2%2B6YUtLf2KCh4eKY
Знак +
становится %2B
. Это отлично работает, если только я не пробовал это через RewriteRule в .htaccess – он не работает. Таким образом, URL-адрес будет
http://www.example.com/page/V1ihnKpip6WpnY7Wm5zn2%2B6YUtLf2KCh4eKY
Файл mypage.php фактически получает cid
как V1ihnKpip6WpnY7Wm5zn2 6YUtLf2KCh4eKY
по какой-то причине заменяя %2B
пробелом.
Любые идеи, почему это может быть так? И как я могу это исправить. Большое спасибо за помощь.
РЕДАКТИРОВАТЬ
Я просто нашел это решение – PHP $ _GET var с urlencode и «&» ошибкой – но мне было интересно, было ли более элегантное решение в .htaccess
чем иметь urlencode
строку дважды?
Попробуйте добавить флаг перезаписи B
Этот флаг сообщает mod_rewrite, чтобы избежать обратных ссылок, в документации сказано следующее :
_rewrite должен удалять URL-адреса перед их сопоставлением, поэтому обратные ссылки не будут отображаться в момент их применения. Используя флаг B, не буквенно-цифровые символы в обратных ссылках будут экранированы.
Поскольку символ %
зарезервирован для обратных ссылок для группировок, согласованных в RewriteCond
предшествующих RewriteRule
, mod_rewrite рассматривает их по-разному и может в конечном итоге попытаться заменить %2
пустой обратной репутацией.
Итак, ваше правило должно выглядеть так:
RewriteRule ^page/(.*)$ my-php-page.php?cid=$1 [B]
Если я правильно понял, перенаправить этот URL-адрес:
http://www.example.com/page/V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
к этому
http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
RewriteEngine On RewriteRule ^page/([^/]*) http://www.example.com/my-php-page.php?cid=$1 [L]
Результат:
http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
без изменения параметра.