Apache rewrite - получить оригинальный URL на PHP - PullRequest
16 голосов
/ 31 марта 2011

У меня есть переписать в nginx или Apache для этого адреса:

http://domain.com/hello

к сценарию типа

http://domain.com/test.php&ref=hell

Как я могу получить доступ к этому переписанному URL в PHP? Потому что, если я использую $_SERVER['REQUEST_URI'], конечно, я получаю:

/test.php&ref=hell

но я хочу только:

/hello

Возможно ли это? Спасибо за помощь.

Upd nginx cnf

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

server
{
  listen 80;
  server_name domain.test;


  location /
  {
    rewrite ^/(main|best|air)$ /core/feeds.php?act=$1 last;
    proxy_pass http://127.0.0.1:8080;
  }
}

Ответы [ 3 ]

12 голосов
/ 31 марта 2011

Это действительно зависит от настроек PHP. С mod_php у вас часто остается исходный путь запроса в REQUEST_URI. Для установок CGI или FastCGI это обычно REDIRECT_URL. Вам нужно проверить страницу phpinfo(), чтобы быть уверенным.

Если вы действительно не можете найти ничего, что могло бы помочь, тогда пришло время обманывать! Вы можете настроить свой RewriteRule следующим образом, чтобы сохранить исходный URL-адрес в переменной среды по вашему выбору:

RewriteRule ^(\w+)$   test.php?ref=$1    [E=ORIG_URI:/$1]

Тогда это будет доступно как $_SERVER["ORIG_URI"], или вы можете просто получить его из URI с помощью $ _GET ['ref']. Но вам придется использовать этот трюк на всех потенциальных RewriteRules.

6 голосов
/ 31 марта 2011

Обычно вы можете найти запрошенный URL в

  • $_SERVER['REQUEST_URI']
  • $_SERVER['REDIRECT_URL'] (возможно, только Apache, не знаю о nginx)

Я знаю, что вы упомянули $_SERVER['REQUEST_URI'] содержит ваш переписанный URL, но во всех моих тестах он содержит исходный запрос.

Почему бы вам не сбросить $_SERVER и не посмотреть, что там.

5 голосов
/ 19 апреля 2011

В Nginx conf нам нужно добавить заголовок пользователя с request_uri:

proxy_set_header request_uri $request_uri;

и прочитать его в php:

echo $_SERVER['HTTP_REQUEST_URI'];

upd

по какой-то причине nginx не нравится символ '_' в имени заголовка, не знаю, как он работал раньше, возможно, что-то изменилось после обновления nginx.Теперь я использую

proxy_set_header rewriteduri $request_uri;

и в php

$_SERVER['HTTP_REWRITEDURI']
...