2014-01-09 3 views
1

У меня возникли трудности с mod_rewrite, когда URL является частью строки запроса.mod_rewrite с URL-адресом в строке запроса

Мое текущее правило перезапись:

<IfModule mod_rewrite.c> 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php?action=$1 [L] 
</IfModule> 

будет переписан http://example.com/Controller/action&url=example.com к http://example.com/index.php?action=Controller/action&url=example.com, который работает, как ожидалось, с $_GET существа:

Array 
(
    [action] => Controller/action 
    [url] => example.com 
) 

Однако я желаю $_GET['url'] включить http:// и строка запроса, например, http://example.com/?a=1&b=2, так что $_GET будет:

Array 
(
    [action] => Controller/action 
    [url] => http://example.com/?a=1&b=2 
) 

я впервые попробовал кодирующий (строку запроса) URL с rawurlencode:

http://example.com/Controller/action&url=http%3A%2F%2Fexample.com%2F%3Fa%3D1%26b%3D2 

Это, однако, дает Apache ошибку:

Not Found

The requested URL /Controller/action&url= http://example.com/?a=1&b=2 was not found on this server.

Мое первое предположение состоит в том, что закодированные / с нарушают пишут правило, и поэтому я удалил их, исправив ошибку. Это, однако, вызывает две проблемы. Главное в том, что нет больше никаких / с в строке запроса (так что URL является http:example.com?a=1&b=2), а во-вторых, что & ы проходят лечение в буквальном смысле, давая $_GET значение:

Array 
(
    [action] => Controller/action 
    [url] => http:example.com?a=1 
    [b] => 2 
) 

Если кто-нибудь знает, как обойти эти проблемы, я был бы очень благодарен.

Разъяснение

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

Array 
(
    [action] => A/b/c/d 
    [href] => https://test.com/Test/test?test=test 
    [rhyme] => Jack & Jill 
) 

Единственный постоянный является то, что она начинается с / отделенной списка слов (например, /Controller/action/param1/param2/param3...). Необязательная строка запроса может быть любой, например. &user_id=1&api_key=1234&optional_option_1=a&optional_option_2=b&url=....

Так себе доступ третьих сторон, где они доступ к нашему сайту через URL (например, http://example.com/Dashboard/view с пользовательскими параметрами по их выбору (так что, если они используют &name=Michael&age=25&uihfwiu=alrjnwvur он покажет:

name: Michael

age: 25

uihfwiu: alrjnwvur

В настоящее время единственные проблемы когда значения содержат / с или & с - это прекрасно работает, как-то, когда они не присутствуют

+0

Простейшим будет использовать то, что работал до и предварять 'HTTP: //' просто с PHP '$ URL =«HTTP : // '. $ _GET ['url']; 'Я бы не стал слишком сильно переписывать, особенно не URL-адрес в URL-адресе, .. Начало URL-адреса. 'http: // example.com/Controller/action & url = example.com' как нет'? 'перед первым параметром anyways – DanFromGermany

ответ

1

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

..
/Controller/action&url=http%253A%252F%252Fexample.com%252F%253Fa%253D1%2526b%253D2&name=Michael&age=25 
+0

Это действительно должно быть динамичным; это не всегда будет '& url' - это может быть что угодно (или ничего). – MichaelRushton

+0

ok Я обновлю ответ. – anubhava

+0

Попробуйте обновить ответ. – anubhava

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