Removendo a extensão .php com mod_rewrite

Eu quero um conjunto de regras mod_rewrite para que eu possa se referir a uma página sem a extensão .php, mas que tenha reescrito para include a extensão php. Isso estará sendo executado em um servidor 1 & 1.

Há boas referências para que eu possa aprender mais?

RewriteEngine On RewriteRule something something.php [L] 

http://example.com/something será tratado como se fosse um pedido para something.php

Para redirect todas as solicitações que não são um arquivo físico para o mesmo nome, mas com .php:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*) $1.php [L] 

A resposta aceita acima não remove a extensão .php dos URLs, apenas permite que você visite arquivos .php sem extensão. Para remover completamente a extensão .php dos URLs, você pode usar as seguintes regras em root/.htaccess :

 RewriteEngine on #1)externally redirect "/file.php" to "/file" RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] RewriteRule ^ /%1 [NC,L,R] #2)Internally map "/file" back to "/file.php" RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*?)/?$ /$1.php [NC,L] 

Provavelmente, o que você realmente quer é apenas uma maneira de não ter o sufixo. A melhor maneira que encontrei de fazer isso é usar a diretiva Files em arquivos .htaccess ou em arquivos de configuração do apache:

  SetHandler cgi-script  

Isso evita algumas das desvantagens das reescritas, por exemplo, o access direto do arquivo .php.

Arquivo .htaccess: adicione as seguintes linhas:

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

https://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess/

Agora você teria que verificar a condição AllowOverride no arquivo apache2.log: set options AllowOverRide All no diretório raiz da web:

  Options Indexes FollowSymLinks AllowOverride All Require all granted 

Se você tentar acessar sua página da Web sem a extensão .php, poderá encontrar o seguinte erro no seu arquivo apache error.log: /var/www/html/web/.htaccess: Comando inválido ‘RewriteEngine’, talvez escrito incorretamente ou definido por um módulo não incluído na configuração do servidor

Para corrigir isso: Você não tem o módulo mod_rewrite instalado. Para instalá-lo: Execute o seguinte comando: ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load

.htaccess: Comando inválido ‘RewriteEngine’, talvez escrito incorretamente ou definido por um módulo não incluído na configuração do servidor

Novamente, depois de atualizar a página da Web, você pode obter o seguinte erro no arquivo error.log:

 [negotiation:error] [pid 4650] [client 127.0.0.1:46461] AH00687: Negotiation: discovered file(s) matching request: /var/www/html/web/test (None could be negotiated). (I was trying to access localhost/web/test.php using the url: localhost/web/test) 

Para consertar isso você teria que adicionar as seguintes linhas no apache2.conf:

  AddType application/x-httpd-php .php AddType application/x-httpd-php .phtml AddType application/x-httpd-php .php3 AddType application/x-httpd-php .php4 AddType application/x-httpd-php .html AddType application/x-httpd-php-source .phps 

https://forums.digitalpoint.com/threads/htaccess-addtype-application-x-httpd-php-php-htm-html-and-maybe-a-fix.7584/#post-2491687

Agora, posso acessar o arquivo test.php usando apenas o nome do arquivo: test

Esta opção fará URLs limpas SEO amigável. Removendo extensões.php do URL visível, e garantindo que as URLs acessadas sem o .php ainda exibam o arquivo .php. Não consegui encontrar outra resposta que conseguisse isso em vários segmentos.

Lembre-se de ativar a reescrita de mod. No Debian ou Unbuntu linux o seguinte irá funcionar

sudo a2enmod rewrite

e

serviço sudo apache2 restart

Modifique a seção correspondente do seu arquivo apache2.conf para o seguinte.

  Options Indexes FollowSymLinks AllowOverride All Require all granted RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*) $1.php [L] RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] RewriteRule ^ /%1 [NC,L,R]  

Se estiver usando o .htaccess para rewrite, certifique-se de que o apache2.conf tenha pelo menos essas opções ativadas.

  Options Indexes FollowSymLinks AllowOverride All Require all granted RewriteEngine On  

Finalmente, em algumas instalações do Apache, você pode precisar configurar o AllowOveride All em um arquivo .conf em / etc / apache2 / sites-available ou /etc/apache2/sites-enabled.
Reescrevendo a partir do arquivo apache2.conf em oposição ao .htaccess há rumores de ser mais rápido.

Para obter http://example.com/test links http://example.com/test.php, use:

 RewriteEngine on RewriteRule ^([^\.]+)$ /folder/$1.php [NC,L] 

Por algum motivo, não consegui fazer com que qualquer outra solução funcionasse corretamente. Eu coloquei isso em um arquivo .htaccess na raiz do meu site. Espero que isso funcione para você.

 RewriteEngine on #only use this once per .htaccess RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php 

É importante ter em mente que, se o seu header ou URL contiver a extensão .php, ela não será removida. Você precisará remover a extensão.

Usa isto…

 header 'location: /login'; 

ao invés disso …

 header 'location: /login.php'; 

Para direcionar alguns arquivos simples, pode ser mais fácil evitar o RewriteEngine.

Eu usei isso:

  SetHandler application/x-httpd-php  

Isso é menos poderoso e flexível do que rewrite, mas provavelmente mais rápido e parece ser o caminho a percorrer se você deseja apenas ter alguns arquivos específicos tratados como PHP.