htaccess: Remova a extensão do PHP apenas para arquivos ou pastas específicos

2

Atualmente, estou usando o seguinte em /public_html/.htaccess para remover extensões .php e forçar barras finais.

# Remove .php extension
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/(.+)/$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^(.*)/$ $1.php [L]

# Force trailing slash
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]

Isso funciona perfeitamente, no entanto, há vários arquivos PHP em subpastas de / public_html que não queremos que sejam reescritos.

Como posso modificar a barra + reescrita para aplicar somente aos arquivos PHP na pasta / public_html, ou, para especificar uma lista de arquivos PHP aos quais a regra se aplica?

UPDATE: No meu caso, acredito que a solução ideal será remover a extensão do PHP (e adicionar barra final) apenas aos arquivos explicitamente especificados, em vez de criar condições baseadas na pasta.

UPDATE 2: Solução de trabalho:

#Remove PHP extension from named files
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(file1|file2)/?$ /$1.php [L,NC]
    
por fournines 26.09.2016 / 10:09

1 resposta

1

Você poderia simplesmente fazer uma exceção no início do seu arquivo .htaccess ... se a solicitação corresponder a uma dessas subpastas ( e é um arquivo PHP existente?) e então parar o processo de reescrita . Por exemplo:

RewriteRule ^(subfolder1|subfolder2)$ - [L]

Se você simplesmente quiser ignorar todas as solicitações, pode parar por aí. Se você especificamente precisa apenas pular as reescritas se elas corresponderem aos arquivos PHP existentes então:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(subfolder1|subfolder2)/.+\.php$ - [L]

Se a solicitação for para /subfolder1/<something>.php e esse arquivo existir, pare aqui.

UPDATE # 1:

We only want this to apply to PHP files in /public_html, and none of its subfolders

Você provavelmente ainda pode fazer isso com uma exceção antes das regras existentes. Se o pedido contiver uma barra (ou seja, é para uma subpasta), aborte. Por exemplo:

RewriteRule /.*/?$ - [L]

Como alternativa, altere o padrão em seu RewriteRule s existente para corresponder a qualquer coisa, exceto uma barra (ou seja, [^/]* ) em vez de literalmente tudo (ou seja, .* ). Aplicado às suas regras existentes:

RewriteRule ^([^/]*)\.php$ /$1/ [L,R=301]
:
RewriteRule ^([^/]*)/$ $1.php [L]
:
RewriteRule ^[^/]*$ $0/ [L,R=301]

UPDATE # 2: Adicionadas âncoras aos padrões RewriteRule acima.

UPDATE # 3: Para fazer isso, aplique-se apenas a arquivos específicos na raiz do documento. Você usaria uma exceção (como no exemplo acima) que exclui todos os outros arquivos. Por exemplo:

RewriteRule !^(file1|file2|file3|file4) - [L]

Para permitir que todos os URLs iniciem /file1 , /file2 , /file3 , etc. (o URL correspondido pelo padrão RewriteRule não inicia com uma barra por -diretório .htaccess arquivos.)

No contexto ...

Options -MultiViews
RewriteEngine On

# Only allow specific requests to be processed...
RewriteRule !^(file1|file2|file3|file4) - [L]

# Remove .php extension
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]

# Force trailing slash
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]

# Route request...
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/(.+)/$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^(.*)/$ $1.php [L]
    
por 26.09.2016 / 12:17