Como eu faço todas as URLs serem executadas através de um único arquivo PHP?

7

Como os sistemas MVC onde os URLs estão nesses formulários forçam todas as solicitações através de um único arquivo index.php?

http://www.example.com/foo/bar/baz
http://www.example.com/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/hey/you

EDIT: Quando eu tento as regras de reescrita abaixo eu recebo este erro:

[error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1
[error] [client 127.0.0.1] Invalid URI in request GET /abc HTTP/1.1

EDIT: Ah, este é o conteúdo completo do /index.php. Quando eu removo as regras de reescrita, o resultado é '/' ou '/index.php' ou recebo um 404 para qualquer outra coisa.

<?php
echo htmlspecialchars($_SERVER['REQUEST_URI']);
?>

RESOLVIDO: Eu adicionei um / na frente de index.php na regra de reescrita e então funcionou:

Resolvido novamente: Acontece que o / só foi necessário porque eu estava executando 2.2.4. Quando atualizei para o 2.2.11, o / não era mais necessário.

    
por jmucchiello 25.07.2009 / 17:46

2 respostas

8

Se você estiver usando o Apache, use reescrever via mod_rewrite :

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?q=$1 [L,QSA]

Isto irá reescrever seus URLs para »index.php? q = foo / bar / baz« de forma transparente.

As linhas 2. e 3. dizem ao mecanismo de reescrita para não reescrever o URL se ele apontar para um arquivo ou diretório existente. Isso é necessário para ter acesso aos arquivos reais fornecidos pelo servidor httpd.

    
por 25.07.2009 / 17:54
1

O código abaixo usa o mod_rewrite do Apache para reescrever todas as URLs que não apontam para um arquivo físico ou diretório a ser mapeado para index.php. O resultado final será:

http://www.example.com/index.php/foo/bar/baz
http://www.example.com/index.php/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/index.php/hey/you

Regravar regra:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

Explicação:

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

Ambas as linhas acima ditam que esta regra não se aplica a arquivos regulares (-f) ou diretórios (-d).

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

Mais informações sobre como criar regras mod_rewrite podem ser obtidas no site da Apache: link .

    
por 25.07.2009 / 18:14