Ser Programador

Configurando url prefix no CodeIgniter

Utilize no lugar do index.php qualquer texto de sua escolha assim como é possível com o url suffix no CodeIgniter.


No Codeigniter existe uma configuração chamada url_suffix (encontrada no config/config.php) onde você customiza qualquer sufixo para suas url's geradas pelo framework.

A questão é que não existe no Codeigniter uma configuração "inversa" (muito útil por sinal) a essa, como url_prefix, por exemplo.

Imagine a seguinte situação: Você recebe reclamações do seu cliente alegando de que as páginas visualizadas pelos usuários do sistema que você aplica manutenções, não competiam com o perfil de usuário que foi feito o login. Analisando mais a fundo, percebemos que o que era mostrado para um usuário, na verdade era carregado de um cache do proxy do que outro usuário via.

De forma mais simplista, o sistema trabalha com acesso de dois perfis diferentes à mesma página/controller, apresentando informações diferentes pertinentes a cada qual. Porém dentro da rede do cliente, todos viam a mesma coisa.

Solução: Forçar que o url sempre fosse diferente em cada acesso a qualquer url no sistema, exigindo assim que o proxy a recarregue a url requisitada, não fazendo load do cache.

Como:

Alterando o arquivo .htaccess da seguinte forma:

        RewriteEngine on
    
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        
        RewriteRule ^([0-9]*)/(.*)$ index.php/$2 [L]
    

Originalmente a linha seis é assim:

        RewriteRule ^(.*)$ index.php/$1 [L]
    

Na expressão regular acima, o início com acento circunflexo (^) e término com sifrão ($) estabelece exatamente regras que contemplam desde logo após o domínio até o final da url em si.

Com essa alteração obrigamos o servidor a entender que toda e qualquer url terá:


Também estamos exigindo que toda e qualquer url que case com a regra acima, será direcionada para index.php/$2 onde:


Note que como padrão do Codeigniter este segmento recebe nome de $1, porém agora com a nossa regra ele é o segundo segmento, sendo assim será $2.



Por exemplo, toda url que estiver assim:

        http://serprogramador.com.br/123456789/home
    

Será direcionada para:

        http://serprogramador.com.br/index.php/home
    

Após configurar o .htaccess, precisamos customizar o parâmetro index_page no config/config.php.

Originalmente a configuração é assim:

        $config['index_page'] = 'index.php';
    

Podemos trocar para algo que fique mais dinâmico, como:

        $config['index_page'] = time();
    

Pronto, agora sim. Para todo url, no lugar do index.php entrará um string numérico.

A função time() retorna a contagem dos milisegundos no formato unix.


Mais abaixo, ainda no config/config.php na sessão Protocolo URI:

        /*
        |--------------------------------------------------------------------------
        | URI PROTOCOL
        |--------------------------------------------------------------------------
        |
        | This item determines which server global should be used to retrieve the
        | URI string.  The default setting of 'AUTO' works for most servers.
        | If your links do not seem to work, try one of the other delicious flavors:
        |
        | 'AUTO'			Default - auto detects
        | 'PATH_INFO'		Uses the PATH_INFO
        | 'QUERY_STRING'	Uses the QUERY_STRING
        | 'REQUEST_URI'		Uses the REQUEST_URI
        | 'ORIG_PATH_INFO'	Uses the ORIG_PATH_INFO
        |
        */
        $config['uri_protocol']	= 'AUTO';
    

Dessa forma vemos o seguinte texto:

"[...] If your links do not seem to work, try one of the other delicious flavors", que traduzindo fica algo parecido com "Se seus links parecem não funcionar, tente um desses outros sabores deliciosos".

Basta configurar para PATH_INFO da seguinte forma:

    $config['uri_protocol']	= 'PATH_INFO';
    

E então Voilá!

Agora o sistema passou a entender os urls do tipo:

        http://serprogramador.com.br/123456789/home
    

Da mesma forma que entenderia o:

        http://serprogramador.com.br/index.php/home