Como faço para que todos os URLs sejam executados em um único arquivo PHP?

9

Como os sistemas MVC em que os URLs estão nessas formas forçam todas as solicitações por meio 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

Edição: Quando tento reescrever as regras abaixo, 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 removo as regras de reescrita, ela gera '/' ou '/index.php' ou recebo um 404 para qualquer outra coisa.

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

RESOLVIDO: Adicionei um / na frente do index.php na regra de reescrita e funcionou:

RESOLVIDO NOVAMENTE: Acontece que o / era necessário apenas porque eu estava executando o 2.2.4. Quando atualizei para o 2.2.11, o / não era mais necessário.

jmucchiello
fonte
Qual conjunto de regras você usou? Eu tentei os dois e ambos estão funcionando bem. Você tem certeza que ativou o mod_rewrite?
Manuel Faux
O servidor não iniciaria se mod_rewrite não estivesse ativo. Este é o Apache 2.2 no WinXP, se isso importa.
28139 jmucchiello

Respostas:

12

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

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

Isso reescreverá seus URLs para »index.php? Q = foo / bar / baz« de forma transparente.

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

Manuel Faux
fonte
Veja a edição acima. Obtendo o erro 400.
jmucchiello 26/07/2009
Qual foi a solicitação exata que você enviou ao servidor? Seu servidor possui o mod_rewrite instalado? Acho que sim, porque, caso contrário, não será iniciado por causa de um erro de sintaxe.
Manuel Faux
A edição mostra a solicitação exata: localhost: 8181 e localhost: 8181 / abc . Se eu remover as regras de reescrita, obtenho meu index.php com / e um 404 normal com / abc.
28139 jmucchiello
Eu adicionei um / na frente do index.php e isso corrigiu o problema.
28139 jmucchiello
Misterioso ... Testei sem a barra e funcionou para mim com o apache-2.2.11-8.
Manuel Faux
1

O código abaixo usa o mod_rewrite do Apache para reescrever todos os URLs que não apontam para um arquivo ou diretório físico 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

Regra de reescrita:

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 determinam 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: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html .

nabrond
fonte
Veja a edição acima. Obtendo o erro 400.
jmucchiello 26/07/09
Eu gostaria de poder definir as duas respostas como corretas.
28139 jmucchiello