问题
I have a rewrite rule in .htaccess
RewriteRule ^page/(.*)$ my-php-page.php?cid=$1
I am passing a encoded string which contains characters like =
and +
- this is the encoded string;
V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
When in the complete URL it's
http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
now this doesn't work because of the +
sign. So I want to send the cid
urlencoded which then becomes;
http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2%2B6YUtLf2KCh4eKY
The +
sign becomes %2B
. This works great, except when I try this through the RewriteRule in .htaccess - it doesn't work. So the URL would be
http://www.example.com/page/V1ihnKpip6WpnY7Wm5zn2%2B6YUtLf2KCh4eKY
The mypage.php file actually receives the cid
as V1ihnKpip6WpnY7Wm5zn2 6YUtLf2KCh4eKY
for some reason replacing %2B
with a blank space.
Any ideas why it may be doing that? And how can I fix it. Many thanks for the help.
EDIT
I just found this solution - PHP $_GET var with urlencode and "&" bug - but I was wondering if there was a more elegant solution in .htaccess
than having to urlencode
the string twice?
回答1:
Try adding the B
rewrite flag. This flag tells mod_rewrite to escape backreferences, the documentation says this:
_rewrite has to unescape URLs before mapping them, so backreferences will be unescaped at the time they are applied. Using the B flag, non-alphanumeric characters in backreferences will be escaped.
Since the %
character is reserved for backreferences to groupings matched in RewriteCond
statements preceeding the RewriteRule
, mod_rewrite treats them differently and could end up attempting to replace the %2
with a blank backreference.
So your rule should look like this:
RewriteRule ^page/(.*)$ my-php-page.php?cid=$1 [B]
回答2:
If I understood right, to redirect this URL:
http://www.example.com/page/V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
to this one
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]
The result is:
http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY
with no change in the parameter.
来源:https://stackoverflow.com/questions/13720650/htaccess-url-encoded-string-not-passing-to-page-correctly