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>