2009-02-02 4 views
9

Как переопределение URL-адресов влияет на параметр $_GET для PHP?

Скажем, у меня есть URL-адрес, такой как http://example.com/index.php?p=contact, и я использую $_GET['p'], чтобы сообщить index.php для обслуживания страницы контактов. Если я использую правило перезаписи, которое преобразует URL-адрес в http://example.com/contact, будет $_GET['p'] по-прежнему работать должным образом?

Если да, не могли бы вы подробно остановиться на том, почему это работает? Если нет, то какие стратегии могут быть использованы для решения проблемы, чтобы страница работала как с переписью, так и без нее?

+0

Теперь серьезно, я единственный, кто замечает здесь, что он пытается конвертировать http://example.com/index.php?p=contact к http://example.com/contact, а не http://example.com/contact к http://example.com/index.php?p=contact, как все здесь делают? –

+0

Я неправильно понял, как это работает, но ответы здесь помогли исправить мое понимание. – VirtuosiMedia

ответ

4

Да, это будет работать должным образом.

+0

Так переписывает ли просто переписывать URL-адрес в строку местоположения в браузере, но все еще обслуживает неписанный URL-адрес скрипта? – VirtuosiMedia

+0

Вы печатаете www.example.com/page/8 и переписываете страницу/8 и меняете ее на index.php? Page = 8, прежде чем ваш скрипт видит. – Grant

+0

rewrite может либо изменить URL-адрес внутри, не сообщая пользователю, либо сразу перенаправить его/ее на новый URL-адрес, в зависимости от параметров, которые вы используете. Он может даже прокси-сервер на новой странице с другого сервера, если вы сообщите об этом. – Grant

0

Вы переписываете URL от /contact до /index.php?p=contact, так что да, он будет работать так, как ожидалось.

0

Не так ли, что изменение заголовков после отображения частей страницы может вызвать зависание на php-страницах? Как вы переписываете URL-адрес? Возможно, я неправильно понял ...

+0

Я думал, что с mod_rewrite или что-то подобное – SilentGhost

+0

Переписать будет через правило перезаписи Apache. Я не знаю много об этом, поэтому вопрос, но я не думаю, что заголовки касаются вообще. – VirtuosiMedia

+0

Можно ли использовать POST, а не GET, а затем создать subdir ROOT/contact в вашем webdir, чей Apache INDEX указывает на правильную страницу? Сорт странного решения, но он может решить обе указанные проблемы ... –

1

При переписывании URL это делается mod_rewrite - страница, полученная в конце, по-прежнему является «старой», то есть index.php? P = contact. Другими словами, браузер извлекает/связывается. mod_rewrite переписывает его на index.php? p = contact. Сценарий, из-за этого, не знает, что произошло какое-либо переписывание - его все еще называют его «обычным» способом. Поэтому такая переработка будет работать. Возможно, вам стоит подумать об этом как о переписывающем прокси-сервере, который запрашивает другую страницу, чем запрашиваемый исходный браузер.

1

Когда клиент запрашивает http://example.com/contact, сервер использует правило перезаписи для обслуживания http://example.com/index.php?p=contact. Клиент не сможет увидеть перезаписанный URL-адрес и даже не сможет сказать, что он был переписан. Запрос любого URL-адреса, поскольку клиент предоставит вам ту же страницу.

-2

В вашем случае это не сработает. mod_rewrite, после того, как он находит совпадение и переписывает http://example.com/index.php?p=contact на http://example.com/contact, выполняет внутреннюю переадресацию. Даже после перенаправления новый, перенаправленный URI все еще может быть сопоставлен с условием и далее перенаправлен.

В любом случае входящие URI не хранятся в памяти, поэтому даже Apache не может восстановить исходный URI. PHP, к тому моменту, когда он выполняется, также не знает оригинальный URI. Следовательно, вы теряете свои $ _GET-вары, поскольку переменные, отправленные через GET, содержатся в URL-адресе, который теперь был преобразован, а PHP заполняет ассоциативный массив $ _GET, анализируя входящие запросы.Если у вас есть http://domain.com/segment1/segment2/segment3, вам нужно связать сегменты чем-то значимым. Вы разделили бы свой домен и взорвались бы на '/', и в вашем случае вы могли бы сказать, что первый сегмент запрашивает страницу, а от http://example.com/contact/ вы можете извлечь страницу = 'контакт'

+0

Это зависит от того, что такое правило перезаписи. В зависимости от правила он может быть восприимчив к дальнейшим правилам или останавливаться прямо там. Вы можете проиграть получить vars, но это зависит от правил перезаписи, которые VirtuosiMedia еще не начала строить, так что это спорный вопрос. – Grant

+0

Ну, в его случае, переходя от http://example.com/index.php?p=contact к http://example.com/contact, вы лишаете вас каких-либо GET-варов, поэтому нет $ _GET ['p' ] не будет работать. –

+0

@kRON: он лишит вас сценария, как вы думаете? – SilentGhost

31

Я бы внес поправки в ответ Гранта на «Да, это будет работать в основном, как и ожидалось».

В частности, поведение mod_rewrite в отношении существующих строк запроса может быть неожиданным.В качестве примера, давайте рассмотрим следующее правило, которое преобразует URL вы в комплект поставки:

RewriteRule /contact /index.php?p=contact 

Это правильно переписать /contact в /index.php?p=contact и название страницы будет доступна через $_GET['p']. Однако, если вы используете этот метод со сценарием, который использует параметры, отличные от названия страницы, он становится немного сложнее. Это правило также переводит /contact?person=Joe в /index.php?p=contact. Параметр person=Joe полностью исчезает! Есть два способа справиться с этим.

Самый простой способ заключается в использовании («строки запроса на добавление») флаг [QSA] на правиле, которое будет поместить исходную строку запроса после параметров, поставляемых в правиле, перевод /contact?person=Joe к /index.php?p=contact&person=Joe:

RewriteRule /contact /index.php?p=contact [QSA] 

Однако это может привести к тому, что ваш параметр p= будет перезаписан. Посещение /contact?p=about будет переписано до /index.php?p=contact&p=about, поэтому $_GET['p'] вернет «около» в ваш скрипт, а не «контакт». Чтобы решить эту проблему, используйте переменную QUERY_STRING вместо:

RewriteRule /contact /index.php?%{QUERY_STRING}&p=contact 

Это гарантирует, что $_GET['p'] будет всегда возвращение «контакт» при использовании этого правила, независимо от того, будет ли ваши посетители баловаться с вашей URL. :-)

+0

Спасибо за то, что вы указали некоторые из более тонких вещей. – VirtuosiMedia

+1

Ну, это же самое заставило меня уйти в отставку в выходные, поэтому я подумал, что поделюсь. :-) –

+4

Я бы полностью взял слово «контакт» из строки запроса: «RewriteRule^(. +) $ Index.php/$ 1' означает, что« контакт »доступен в' $ _SERVER ['PATH_INFO'] 'вместо' $ _GET ['q'] '. Другие параметры '$ _GET' не изменяются. – TRiG

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

  • Нет связанных вопросов^_^