Estou construindo um aplicativo PHP no CodeIgniter. CodeIgniter envia todos os pedidos para o controlador principal: index.php
. No entanto, não gosto de ver index.php
no URI. Por exemplo, http://www.example.com/faq/whatever
irá direcionar para http://www.example.com/index.php/faq/whatever
. Preciso de uma maneira confiável para um script saber qual é o seu endereço, para que ele saiba o que fazer com a navegação. Eu usei mod_rewrite
, de acordo com a documentação do CodeIgniter.
A regra é a seguinte:
RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
Normalmente, eu apenas verificaria php_self
, mas neste caso é sempre index.php
. Posso obtê-lo em REQUEST_URI
, PATH_INFO
etc., mas estou tentando decidir qual será o mais confiável. Alguém sabe (ou sabe onde encontrar) a real diferença entre PHP_SELF
, PATH_INFO
, SCRIPT_NAME
, e REQUEST_URI
? Obrigado pela ajuda!
Nota : Tive de adicionar espaços, pois o SO vê o sublinhado e o deixa em itálico por algum motivo.
Atualizado : Corrigidos os espaços.
fonte
Alguns exemplos práticos das diferenças entre essas variáveis:
Exemplo 1. PHP_SELF é diferente de SCRIPT_NAME apenas quando a url solicitada está no formato:
http://example.com/test.php/foo/bar
(este parece ser o único caso em que PATH_INFO contém informações importantes [PATH_INFO] => / foo / bar) Nota: isso costumava ser diferente em algumas versões anteriores do PHP (<= 5.0?).
Exemplo 2. REQUEST_URI é diferente de SCRIPT_NAME quando uma string de consulta não vazia é inserida:
http://example.com/test.php?foo=bar
Exemplo 3. REQUEST_URI é diferente de SCRIPT_NAME quando o redirecionamento do lado do servidor está em vigor (por exemplo, mod_rewrite no apache):
http://example.com/test.php
Exemplo 4. REQUEST_URI é diferente de SCRIPT_NAME ao lidar com erros HTTP com scripts.
Usando a diretiva do apache ErrorDocument 404 /404error.php
http://example.com/test.php
No servidor IIS usando páginas de erro personalizadas
http://example.com/test.php
fonte
/
no final doSCRIPT_NAME
. Isso parece ser consistente no PHP 5.2-5.4 então, considerando editar a resposta para refletir isso.PATH_INFO
só está disponível ao usar htaccess desta forma:Exemplo 1
Continua o mesmo
Raiz
http://domain.com/
Caminho
http://domain.com/test
String de consulta
http://domain.com/test?123
Exemplo 2
Continua o mesmo
Raiz
http://domain.com/
Caminho
http://domain.com/test
String de consulta
http://domain.com/test?123
Exemplo 3
ou
Continua o mesmo
Raiz
http://domain.com/
Caminho
http://domain.com/test
Língua
http://domain.com/en
Caminho da linguagem
http://domain.com/en/test
String de consulta de linguagem
http://domain.com/en/test?123
fonte
Caminhos PHP
$_SERVER['REQUEST_URI']
= Caminho da Web, URI solicitado$_SERVER['PHP_SELF']
= Caminho da Web, arquivo solicitado + informações do caminho$_SERVER['SCRIPT_NAME']
= Caminho da Web, arquivo solicitado$_SERVER['SCRIPT_FILENAME']
= Caminho do arquivo, arquivo solicitado__FILE__
= Caminho do arquivo, arquivo atualOnde
/var/www/index.php
, após a resolução do alias/index.php
dehttp://foo.com/index.php
e pode nem corresponder a nenhum arquivo/index.php?foo=bar
, antes de qualquer regravação de URLOrdem de Operação
REQUEST_URI
PHP_SELF
PHP_SELF
emSCRIPT_FILENAME
+PATH_INFO
SCRIPT_FILENAME
__FILE__
se refere ao caminho para o arquivo atualfonte
$_SERVER['SCRIPT_NAME']
e$_SERVER['PHP_SELF']
, porque mod_rewrite criar o caminho inteiro, que é$_SERVER['PHP_SELF']
. A separação ocorre a seguir. Observe que os aliases também consideram o caminho inteiro para definir o nome do arquivo do script, mas a separação que definiu script_name e path_info já ocorreu, portanto, eles não serão afetados.Você pode querer olhar para a classe URI e fazer uso de $ this-> uri-> uri_string ()
Retorna uma string com o URI completo.
Por exemplo, se este for o seu URL completo:
A função retornaria este:
Ou você pode usar os segmentos para detalhar áreas específicas sem ter que criar valores de análise / regex
fonte
Pessoalmente, eu uso o
$REQUEST_URI
porque ele faz referência ao URI inserido e não ao local no disco do servidor.fonte
Há muito pouco a acrescentar à resposta de Odin. Eu acabei de fornecer um exemplo completo da solicitação HTTP para o arquivo real no sistema de arquivos para ilustrar os efeitos da regravação de URL e aliases. No sistema de arquivos, o script
/var/www/test/php/script.php
éonde
/var/www/test/php/script_included.php
estáe
/var/www/test/.htaccess
ée o arquivo de configuração do Apache inclui o alias
e a solicitação http é
A saída será
O seguinte sempre é válido
Se não houver mod_rewrite, mod_dir, reescrita de ErrorDocument ou qualquer forma de reescrita de URL, também temos
Os aliases afetam os caminhos de arquivo do sistema
SCRIPT_FILENAME
e__FILE__
não os caminhos de URL, que são definidos antes - consulte as exceções abaixo. Os aliases podem usar todo o caminho do URL, incluindoPATH_INFO
. Não poderia haver nenhuma conexão entreSCRIPT_NAME
eSCRIPT_FILENAME
.Não é totalmente exato que os aliases não são resolvidos no momento em que o caminho da URL
[PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
é definido, porque os aliases são considerados para pesquisar o sistema de arquivos e sabemos pelo exemplo 4 na resposta de Odin que o sistema de arquivos é pesquisado para determinar se o arquivo existe, mas isso só é relevante quando o arquivo não é encontrado. Da mesma forma, mod_dir chama mod_alias para pesquisar o sistema de arquivos, mas isso só é relevante se você tiver um alias comoAlias \index.php \var\www\index.php
e o uri de solicitação for um diretório.fonte
Se você esquecer quais variáveis fazem o quê, você pode escrever um pequeno script que use phpinfo () e chamá-lo de um URL com uma string de consulta. Uma vez que as instalações de software de servidor apresentam as variáveis que o PHP retorna, é sempre uma boa ideia verificar a saída da máquina, caso reescritas no arquivo de configuração do servidor estejam causando resultados diferentes do esperado. Salve-o como algo como
_inf0.php
:Então você ligaria
/_inf0.php?q=500
fonte
Faça backup por um segundo, você escolheu a abordagem errada para começar. Por que não apenas fazer isso
em vez de? Então pegue com
$_GET['url'];
fonte
QSA
sinalizador), os parâmetros de string de consulta podem ser substituídos (por exemplo, se você precisar de umurl
parâmetro na solicitação inicial) ou, pior, ficar vulnerável a ataques XSS.