Remova a extensão .php com .htaccess

Sim, eu li o manual do Apache e procurei aqui. Por alguma razão, simplesmente não consigo fazer isso funcionar. O mais próximo que cheguei foi remover a extensão, mas ela aponta para o diretório raiz. Eu quero que isso funcione apenas no diretório que contém o arquivo .htaccess .

Eu preciso fazer três coisas com o arquivo .htaccess .

  1. Eu preciso disso para remover o .php

    uma. Eu tenho várias páginas que usam guias e o URL se parece com a guia page.php # – isso é possível?

    b. Eu tenho uma página que usa uma ID de session anexada à URL para garantir que você veio do lugar certo, www.domain.com/download-software.php?abcdefg .

Isso é possível? Além disso, ao fazer isso, eu preciso remover “.php” dos links no meu arquivo de inclusão do navegador de header? O IE "https://stackoverflow.com/questions/4026021/remove-php-extension-with-htaccess/support" be https://stackoverflow.com/questions/4026021/remove-php-extension-with-htaccess/support?

  1. Eu gostaria de forçar “www” antes de cada URL, por isso não é domain.com , mas www.domain.com/page .
  2. Gostaria de remover todas as barras à direita das páginas.

Eu continuarei procurando, tentando, etc. Estaria em um sub-diretório causando algum problema?

A resposta de Gumbo na pergunta Stack Overflow Como ocultar a extensão .html com o Apache mod_rewrite deve funcionar bem.

Re 1) Altere o .html para .php

Re a) Sim, é possível, basta adicionar #tab ao URL.

Re b.) Isso é possível usando o QSA (Query String Append), veja abaixo.

Isso também deve funcionar em um caminho de subdiretório:

 RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L] 

Mod_rewrite do Apache

O que você está procurando é mod_rewrite ,

Descrição: fornece um mecanismo de reescrita baseado em regras para rewrite os URLs solicitados na hora.

De modo geral, o mod_rewrite funciona combinando o documento solicitado com as expressões regulares especificadas e, em seguida, executa as reescritas de URL internamente (dentro do processo do apache) ou externamente (no navegador do cliente). Essas reescritas podem ser tão simples quanto traduzir internamente example.com/foo para uma solicitação de example.com/foo/bar.

Os documentos do Apache incluem um guia mod_rewrite e acho que algumas das coisas que você quer fazer estão cobertos nele. Guia detalhado de mod_rewrite .

Forçar o subdomínio www

Eu gostaria de forçar “www” antes de cada URL, por isso não é domain.com mas http://www.domain.com/page

O guia de reescrita inclui instruções para isso no exemplo do nome de host canônico .

Remover barras finais (parte 1)

Gostaria de remover todas as barras finais das páginas

Não sei por que você gostaria de fazer isso, pois o guia de reescrita inclui um exemplo para o oposto exato , ou seja, sempre incluindo uma barra à direita. Os documentos sugerem que remover a barra à direita tem um grande potencial para causar problemas:

Problema Trailing Slash

Descrição:

Todo webmaster pode cantar uma música sobre o problema da barra final em URLs que fazem referência a diretórios. Se eles estão faltando, o servidor despeja um erro, porque se você disser /~quux/foo invés de /~quux/foo/ então o servidor procurará por um arquivo chamado foo. E porque esse arquivo é um diretório que reclama. Na verdade, ele tenta consertá-lo na maioria dos casos, mas às vezes esse mecanismo precisa ser imitado por você. Por exemplo, depois de ter feito um monte de reescritas de URL complicadas para scripts CGI, etc.

Talvez você possa expandir por que você deseja remover a barra à direita o tempo todo?

Remover extensão .php

Eu preciso disso para remover o .php

A coisa mais próxima de fazer isso é pensar em rewrite internamente cada documento de solicitação com uma extensão .php, ou seja, example.com/somepage é processado como uma solicitação para example.com/somepage.php. Note que proceder dessa maneira exigiria que cada página realmente existisse como somepage.php no sistema de arquivos.

Com a combinação certa de expressões regulares, isso deve ser possível até certo ponto. No entanto, posso prever alguns possíveis problemas com páginas de índice não sendo solicitadas corretamente e não correspondendo diretórios corretamente.

Por exemplo, isso irá rewrite corretamente example.com/test como uma solicitação para example.com/test.php:

 RewriteEngine on RewriteRule ^(.*)$ $1.php 

Mas fará com que example.com não seja carregado porque não há example.com/.php

Eu vou adivinhar que, se você estiver removendo todas as barras à direita, escolher um índice de diretório a partir de uma solicitação para um nome de arquivo no diretório pai se tornará quase impossível. Como você determina um pedido para o diretório ‘foobar’:

 example.com/foobar 

de uma solicitação para um arquivo chamado foobar (que é, na verdade, foobar.php)

 example.com/foobar 

Pode ser possível se você usou a diretiva RewriteBase . Mas se você fizer isso, esse problema se torna mais complicado, já que você vai precisar de diretivas RewriteCond para fazer a verificação no nível do sistema de arquivos se a solicitação mapear para um diretório ou um arquivo.

Dito isso, se você remover sua exigência de remover todas as barras à direita e, em vez disso, forçar o uso de barras à direita, o problema “no .php extension” se tornará um pouco mais razoável.

 # Turn on the rewrite engine RewriteEngine on # If the request doesn't end in .php (Case insensitive) continue processing rules RewriteCond %{REQUEST_URI} !\.php$ [NC] # If the request doesn't end in a slash continue processing the rules RewriteCond %{REQUEST_URI} [^/]$ # Rewrite the request with a .php extension. L means this is the 'Last' rule RewriteRule ^(.*)$ $1.php [L] 

Isso ainda não é perfeito – cada solicitação de um arquivo ainda tem .php anexado à solicitação internamente. Um pedido de “hi.txt” colocará isso nos seus registros de erro:

 [Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat 

Mas há outra opção, defina as diretivas DefaultType e DirectoryIndex como esta:

 DefaultType application/x-httpd-php DirectoryIndex index.php index.html 

Atualização 2013-11-14 – Corrigido o trecho acima para incorporar a observação do nicorellius

Agora pedidos para hi.txt (e qualquer outra coisa) foram bem-sucedidos, pedidos para example.com/test retornarão a versão processada de test.php e os arquivos index.php funcionarão novamente.

Eu devo dar crédito onde o crédito é devido para esta solução como eu achei Michael J. Radwins Blog , pesquisando no Google por php nenhuma extensão do apache .

Remover barras finais

Alguns procurando por apache remove trailing slashes me trouxeram para algumas páginas de Search Engine Optimization. Aparentemente, alguns Sistemas de Gerenciamento de Conteúdo (Drupal, neste caso) disponibilizarão o conteúdo com e sem uma barra no URls, o que, no mundo do SEO, fará com que seu site incorra em uma penalidade de conteúdo duplicado. Fonte

A solução parece bastante trivial, usando o mod_rewrite que reescrevemos sob a condição de que o recurso solicitado termine em a / e reescreva a URL enviando de volta o header HTTP 301 Permanent Redirect .

Aqui está o exemplo dele, que assume que seu domínio é blamcast.net e permite que a solicitação seja prefixada com www. .

 #get rid of trailing slashes RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC] RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L] 

Agora estamos chegando a algum lugar. Vamos colocar tudo junto e ver o que parece.

Obrigatória www. , não .php e sem barras à direita

Isso pressupõe que o domínio é foobar.com e está sendo executado na porta padrão 80.

 # Process all files as PHP by default DefaultType application/x-httpd-php # Fix sub-directory requests by allowing 'index' as a DirectoryIndex value DirectoryIndex index index.html # Force the domain to load with the www subdomain prefix # If the request doesn't start with www... RewriteCond %{HTTP_HOST} !^www\.foobar\.com [NC] # And the site name isn't empty RewriteCond %{HTTP_HOST} !^$ # Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect RewriteRule ^/?(.*) http://www.foobar.com/$1 [L,R,NE] #get rid of trailing slashes RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC] RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L] 

O sinalizador ‘R’ é descrito na seção diretiva RewriteRule . Snippet:

redirect|R [=code] (force redirect) Prefixo Substituição com http://thishost[:thisport]/ (o que torna o novo URL um URI) para forçar um redirecionamento externo. Se nenhum código for dado, uma resposta HTTP de 302 ( MOVED TEMPORARIAMENTE ) será retornada.

Nota final

Não consegui que a remoção da barra funcionasse com sucesso. O redirecionamento acabou me dando infinitos loops de redirecionamento. Depois de ler a solução original mais de perto, tenho a impressão de que o exemplo acima funciona para eles devido à configuração da instalação do Drupal. Ele menciona especificamente:

Em um site normal do Drupal, com URLs limpas ativadas, esses dois endereços são basicamente intercambiáveis

Em referência a URLs que terminam com e sem uma barra. Além disso,

O Drupal usa um arquivo chamado .htaccess para informar ao seu servidor web como lidar com URLs. Este é o mesmo arquivo que habilita a mágica de URL limpa do Drupal. Ao adicionar um comando de redirecionamento simples ao início do arquivo .htaccess , você pode forçar o servidor a remover automaticamente todas as barras à direita.

Além de outras respostas acima,

Você também pode tentar remover extensões .php do seu arquivo e evitar loop infinito :

 RewriteEngine On RewriteBase / RewriteCond %{THE_REQUEST} ^[AZ]{3,}\s([^.]+)\.php [NC] RewriteRule ^ %1 [R=301,L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*?)/?$ $1.php [NC,L] 

Este código funcionará em Root / .htaccess, Certifique-se de alterar o RewriteBase se quiser colocar isso em um arquivo htaccess no subdiretório.

Editar:

No apache 2.4 e posterior, você também pode usar o flag END para evitar erros infinitos no loop. O exemplo a seguir funciona da mesma forma que o acima no apache 2.4,

 RewriteEngine on RewriteRule ^(.+)\.php$ /$1 [R,L] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*?)/?$ /$1.php [NC,END] 

O código a seguir funciona bem para mim:

 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php 

Aqui está um método se você quiser fazer isso apenas para um arquivo específico:

 RewriteRule ^about$ about.php [L] 

Ref: http://css-tricks.com/snippets/htaccess/remove-file-extention-from-urls/

Depois de alterar o parâmetro AllowOverride de None para All em /etc/apache2/apache2.conf (Debian 8), seguindo isto , o arquivo .htaccess deve conter:

 Options +MultiViews AddHandler php5-script php AddType text/html php 

E foi o suficiente para esconder a extensão .php dos arquivos

Para remover a extensão .php de um arquivo PHP, por exemplo, yoursite.com/about.php para yoursite.com/about Siga estas etapas. Abra o arquivo .htaccess (crie um novo, se não existir) da raiz do seu site, e adicione o seguinte código.

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L] 

Para remover a extensão .html de um arquivo html, por exemplo, yoursite.com/about.html para yoursite.com/about, siga estas etapas.

Abra o arquivo .htaccess (crie um novo, se não existir) da raiz do seu site, e adicione o seguinte código.

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.html [NC,L] 

Referência: Como remover a extensão do php do URL

Não tenho certeza porque as outras respostas não funcionaram para mim, mas esse código que encontrei fez:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L] 

Isso é tudo o que está no meu htaccess e example.com/page mostra example.com/page.php

Se você está codificando em PHP e quer remover .php, você pode ter um URL como:

http://yourdomain.com/blah -> que aponta para /blah.php

Isso é tudo que você precisa:

  RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]  

Se o seu URL em PHP gostar de http://yourdomain.com/demo.php, vem como http://yourdomain.com/demo

Isso é tudo que você precisa:

criar arquivo .htaccess

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f #RewriteRule ^([^\.]+)$ $1.html [NC,L] RewriteRule ^([^\.]+)$ $1.php [NC,L] 

Eu encontrei 100% de trabalho Concept para mim:

 # Options is required by Many Hosting Options +MultiViews RewriteEngine on # For .php & .html URL's: RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L] RewriteRule ^([^\.]+)$ $1.html [NC,L] 

Use este código na raiz do seu site. Htaccess arquivo como:

off-line – wamp \ www \ YourWebDir

online – public_html /

Se não funcionar corretamente, mude as configurações do seu servidor Wamp: 1) Clique esquerdo no ícone WAMP 2) Apache 3) Módulos Apache 4) Clique esquerdo rewrite_module

Aqui está o código que eu usei para esconder a extensão .php do nome do arquivo:

 ## hide .php extension # To redirect /dir/foo.php to /dir/foo RewriteCond %{THE_REQUEST} ^[AZ]{3,}\s([^.]+)\.php [NC] RewriteRule ^ %1 [R=301,L,NC] 

Nota: R=301 é para redirecionamento permanente e é recomendado para fins de SEO. No entanto, se alguém quiser apenas um redirecionamento temporário, substitua-o por apenas R