This is supposed to remove .php file extensions
Bem, falando estritamente, esse código destina-se a adicionar a extensão do arquivo .php
novamente (para rotear o URL). (Você já "removeu" fazendo uma solicitação para /api/products/all
.)
No entanto, esse código não está fazendo o que você acha que está fazendo. Isso está funcionando apenas no seu servidor local por causa da MultiViews
line (parte do mod_negotiation). O código mod_rewrite que segue não está fazendo nada, o que é possivelmente porque isso não está funcionando para você no Heroku?
Se as diretivas mod_rewrite tivessem permissão para serem executadas (ou seja, se MultiViews
fosse desativado ), isso reescreveria uma solicitação de /api/products/all
a /api/products/all.php
, o que claramente não está correto neste exemplo.
Não sei quais outros formatos de URL você está tentando manipular, mas para direcionar especificamente um URL do formulário /api/products/all
para /api.php/products/all
usando mod_rewrite, você precisaria de algo como o seguinte:
RewriteEngine On
RewriteRule ^(api)/(.+) $1.php/$2 [L]
As diretivas RewriteCond
não são obrigatórias se você corresponder apenas a esse URL específico.
...and the "products/all" are just read in with php
Isso é chamado de informações adicionais sobre o nome do caminho e é gerenciado / coletado pelo servidor e passado para o PHP no elemento PATH_INFO
do $_SERVER
superglobal. Se a informação do caminho é permitida, depende do servidor. (Se não, então essas URLs resultariam em um 404.)
UPDATE # 1:
...if I also have files such as example.js.php (where I use php code, but render them as javascript files) and I would like their .php to be removed so they can be accessed via example.js how would I modify the rewrite rule?
Você pode adicionar um bloco de regras adicional como o seguinte:
RewriteCond %{DOCUMENT_ROOT}/$1.$2.php -f
RewriteRule (.+)\.(js)$ $1.$2.php [L]
Isso intercepta todas as solicitações de .js
arquivos e reescreve a solicitação para o arquivo .js.php
correspondente, se existir.
Como alternativa, você pode especificar a diretiva RewriteCond
da seguinte forma:
RewriteCond %{REQUEST_FILENAME}.php -f
Observe que, se os arquivos .js
também estiverem localizados em um caminho de URL que inicie /api/
, essa regra precisará ser anterior à regra acima que roteia suas chamadas de API, para para evitar um conflito.
UPDATE # 2: Você também pode precisar definir o tipo mime correto para esses recursos. (Se funciona ou não com o tipo mime errado depende do navegador.) Como o .js
URL está sendo reescrito internamente para um script PHP (por exemplo, .js.php
), o Apache servirá naturalmente isso com text/html
mime- type (como faz para todos os arquivos PHP por padrão). Você pode verificar se está definindo explicitamente o cabeçalho Content-Type
correto no seu script ou defini-lo em .htaccess
usando a diretiva Header
(mod_headers). Por exemplo:
<FilesMatch "\.js.php$">
Header set Content-Type "application/javascript; charset=UTF-8"
</FilesMatch>
Observe que isso funcionará somente no Apache 2.2.12+ (antes dessa versão, simplesmente não era possível definir o Content-Type
header com a diretiva Header
).
Note também que o método "mais simples" de definir o tipo mime usando o sinal T
no RewriteRule
não funciona em um diretório / .htaccess
contexto - ele é sobrescrito quando a reescrita processo começa de novo.