2013-07-09 3 views
0

Ok поэтому у меня есть URL-адрес, как это:Htaccess Строка запроса перенаправления

http://example.com/admin/test.php?action=edit&id=2 

Однако мне нужно добавить в правило перенаправлять это на другой URL со строкой запроса, как это:

http://example.com/admin/login.php?redirect=test.php%3Faction%3Dedit%26id%3D2 

я добавил правило так:

RewriteRule ^admin/(.*)?$ /login.php?redirect=/admin/$1?%{QUERY_STRING} [R,L] 

И это работает по большей части, но есть одна проблема, строка запроса не является сбежал, поэтому он думает, что это другие переменные $ _GET. Это выглядит так:

http://example.com/admin/login.php?redirect=test.php%3Faction=edit&id=2 

Таким образом, переадресация читается как test.php? Action = edit. Он отсутствует id = 2, потому что он читает его как другую переменную $ _GET вместо части $ _GET ['redirect'].

Возможно ли избежать% {QUERY_STRING}? У меня есть googled все, что я могу думать, и не могу найти ответ нигде.

+0

где вы перенаправляете, потому что вы можете добавить что-то вроде «location (« header: login.php? ». encodeuri (текущий url));' на свою страницу, которая выполняет перенаправление. Затем, если параметр перенаправления отправлен, а логин в порядке, используйте заголовок decodeuri (перенаправление) – Class

+0

У меня нет возможности сделать это. Я работаю в Wordpress, и он приходит по электронной почте, которая автоматически отправляется. Поэтому он отправляет этот url, но мне нужно перенаправить его на логин с перенаправлением в качестве параметра. – ngreenwood6

ответ

0

Ну, если вы не против иметь пучок & в конце вашего закодированного URL-адреса, вы можете использовать дополнительные захваты и кодировать & вручную. Что-то вроде:

RewriteCond %{QUERY_STRING} ^([^&]+)(?:&(.*)|)$ 
RewriteRule ^admin/(.*)?$ /login.php?redirect=/admin/$1\%3F%1\%26%2 [L,NE,R] 

Так что, если вы идете:

http://example.com/admin/test.php?a=1&b=2

вы получите перенаправлены:

http://example.com/login.php?redirect=/admin/test.php%3Fa=1%26b=2

Однако, идя:

http://example.com/admin/test.php?a=1

перенаправит вас:

http://example.com/login.php?redirect=/admin/test.php%3Fa=1%26

и ваш скрипт будет извлекать параметр $_GET['redirect'] как: /admin/test.php?a=1&. До тех пор, пока вы не возражаете против того, чтобы этот бродячий амперсанд в конце.

Если у вас есть много возможных переменные, а не заботиться о амперсанде, просто добавьте еще (?:&(.*)|) до конца условия строки запроса и сопоставить их с обратными ссылками (примером 4):

RewriteCond %{QUERY_STRING} ^([^&]+)(?:&(.*)|)(?:&(.*)|)(?:&(.*)|)$ 
RewriteRule ^admin/(.*)?$ /login.php?redirect=/admin/$1\%3F%1\%26%2\%26%3\%26%4 [L,NE,R] 
+0

Спасибо за ответ, но я не уверен, сколько может быть там. Там может быть даже нет. Я надеялся, что для этого было немного более чистого решения. – ngreenwood6

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