Passando o URI da solicitação para o cabeçalho da solicitação

Essa necessidade decorre da necessidade de passar o URI completo da solicitação e a string de consulta para o aplicativo exatamente como foi solicitado.

O aplicativo para o qual eu precisava era um sistema legado que usava muito reescritas. Assim, é difícil recuperar o URI solicitado real sem reconstruir o URI a partir das variáveis ​​de solicitação, principalmente por causa da variedade de “estruturas” de regra de reescrita. Com melhor planejamento e estrutura de código, teria sido relativamente mais fácil reconstruir a url com base nas variáveis ​​de solicitação. Mas nem sempre temos essa sorte ao herdar aplicativos mais antigos.

Implementação

SetEnvIf Request_URI "^(.*)$" REQUEST_URI=$1
RequestHeader set X-Request-Uri "%{REQUEST_URI}e"
RewriteRule .* - [E=REQUEST_QUERY_STRING:%{QUERY_STRING}]
RequestHeader set X-Query-String "%{REQUEST_QUERY_STRING}e"

As declarações acima requerem que os módulos apache2 rewrite, setenvif e headers sejam habilitados.

Uso

PHP

<?php

function getRequestedURI() {
if ((!isset($_SERVER['X-Request-Uri']) || strlen($_SERVER['X-Request-Uri']) < 1) && isset($_SERVER['REQUEST_URI'])) {
return $_SERVER['REQUEST_URI'];
}

$url
= $_SERVER['X-Request-Uri'];
if (isset($_SERVER['X-Query-String']) && strlen($_SERVER['X-Query-String'])) {
$url
.= '?' . $_SERVER['X-Query-String'];
}

return $url;
}

Fusão a frio

<cffunction name="getRequestedURI">
<cfset var resUrl = ''>
<cfset var headers = GetHttpRequestData().headers />

<cfif !structKeyExists(headers, 'X-Request-Uri') || len(headers['X-Request-Uri']) LT 1>
<cfreturn cgi.server_name />
</cfif>

<cfset resUrl = headers['X-Request-Uri'] />
<cfif structKeyExists(headers, 'X-Query-String') && len(headers['X-Query-String'])>
<cfset resUrl += '?' & headers['X-Query-String'] />
</cfif>

<cfreturn resUrl />
</cffunction>