Как получить ВЕСЬ URL-адрес, который отображается в браузере без JS?

У меня есть приложение, которое я создаю в ColdFusion, благодаря чему все запросы будут выполняться через файл index.cfm.

У меня есть файл .htaccess, который перезаписывает URL-адрес. Так, например... если я напишу:

http://domain.com/hello/goodbye/howdy

Фактический запрос всегда использует index.cfm следующим образом:

http://domain.com/index.cfm/hello/goodbye/howdy

Все это отлично работает, но теперь я застрял в том, как я могу получить все, что находится в URL-адресе. Кажется, ни одна из переменных CGI не выводит часть URL «/hello/goodbye/howdy».

Я пробовал cgi.path_info и cgi.query_string и т. д. безрезультатно... они просто пустые.

Мне нужно захватить все, что идет после доменного имени, и делать с ним что-то в CF. Я знаю, что это возможно в JS, но мне это очень нужно на сервере.

Сброс области CGI не показывает мне ничего полезного в этом отношении:

<cfdump var="#cgi#" />

Вот мой файл htaccess для справки:

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteBase /
RewriteRule ^index\.cfm$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.cfm [L]

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} !^([^\.]+)\.domain\.com
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

</IfModule>

Спасибо.

РЕДАКТИРОВАТЬ:

В качестве дополнительного примечания я также пробовал базовые методы Java, например:

<cfdump var="#getPageContext().getRequest().getContextPath()#" />
<cfdump var="#getPageContext().getRequest().getRequestURL()#" />
<cfdump var="#getPageContext().getRequest().getQueryString()#" />

Безуспешно :(


person Michael Giovanni Pumo    schedule 15.02.2012    source источник
comment
Это странно - QUERY_STRING обычно является переменной, которая содержит именно эту информацию. (По крайней мере, при обычной установке Apache.)   -  person Pekka    schedule 15.02.2012
comment
Да, странно не правда ли. Я действительно недостаточно осведомлен в этом деле, чтобы действительно понять это. Если я делаю обычный URL-адрес, например www.mydomain.com/?/hello/how/can/i/help, то, похоже, он работает. Очевидно, ? является триггером здесь. Но мой файл .htaccess должен свести на нет его обязательное использование.   -  person Michael Giovanni Pumo    schedule 15.02.2012
comment
аггх, как Юра говорит ниже, это REQUEST_URI конечно, а не QUERY_STRING. QUERY_STRING содержит только часть после ? по дизайну. Извиняюсь   -  person Pekka    schedule 15.02.2012


Ответы (4)


<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /

RewriteRule ^index\.cfm$ - [L]

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} !^([^\.]+)\.domain\.com
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

#Change exists here:
RewriteRule ^(.*)$ /index.cfm?actualuri=$1 [L,QSA]

</IfModule>

попробуйте cgi.query_string сейчас. Он должен иметь actualuri=/the/path/sent.
Кроме того, поместите правила перезаписи в том же порядке, что и выше.

person ThinkingMonkey    schedule 15.02.2012
comment
Привет, спасибо за вклад. Я пробовал это, и это, кажется, нарушает запрос. Я получаю стандартный 404 в этот момент. Любые дальнейшие идеи? Спасибо. - person Michael Giovanni Pumo; 15.02.2012
comment
Привет еще раз. Кажется, это снова заработало, но теперь строка запроса всегда возвращает 0. Например, в ней указано facturi=0 независимо от того, что введено в URL-адресе. - person Michael Giovanni Pumo; 15.02.2012
comment
РЕДАКТИРОВАТЬ! На самом деле... кажется, что он возвращает только ПОСЛЕДНИЙ символ строки. Поэтому, если я напишу www.domain.com/hmm, он вернет m. В идеале нужен весь путь, независимо от того, насколько он длинный. - person Michael Giovanni Pumo; 15.02.2012
comment
Хорошо, что разобрались! Большое спасибо! Вы .htaccess волшебник ниндзя! Я предоставлю вам кредиты ответа. Еще раз спасибо. - person Michael Giovanni Pumo; 15.02.2012
comment
@MichaelGiovanniPumo Добро пожаловать. - person ThinkingMonkey; 15.02.2012

Проверьте #CGI.REQUEST_URI# - это недокументировано, но работает

person Jura Khrapunov    schedule 15.02.2012
comment
Ты уверен? Согласно документам, это работает: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html Технически это задокументировано. Помните, что область CGI в CF частично управляется веб-сервером. Поскольку разные веб-серверы отправляют разные значения, cfdump области CGI не всегда будет отображать все, что вы можете использовать. Черт возьми, вы даже можете вывести cgi.ray (попробуйте). - person Raymond Camden; 15.02.2012
comment
Привет, Рэй, я чувствую, что ты, возможно, прав в этом смысле. Еще одно осознание того, что на переменные CGI, возможно, лучше не полагаться. Однако я разобрался с модификацией ThinkingMonkey .htaccess. Работает как шарм. PS Рэй...большой поклонник твоего блога/работы! - person Michael Giovanni Pumo; 15.02.2012

Надеюсь, это то, что вы ищете.

  <cfset link = "http://" & GetHttpRequestData().headers['host'] & GetHttpRequestData().headers['X-REWRITE-URL'] >
person Vikrant Shitole    schedule 05.08.2013
comment
GetHttpRequestData().headers['X-ORIGINAL-URL'] работал у меня (IIS 7.5) - person Jeremy Halliwell; 27.10.2013

Я думаю, что самый простой способ - это посмотреть на поле CGI.PATH_INFO.

person Jake Feasel    schedule 15.02.2012
comment
Но вы не получите строку запроса, и cgi дает вам фактический путь, а не копию URL-адреса. Есть еще одно решение, если вы используете java-скрипт document.URL. - person Vikrant Shitole; 17.08.2013