Назад | Перейти на главную страницу

.htaccess удалить расширение файла php не работает только на heroku

Итак, у меня есть приведенный ниже код в моем файле .htaccess на моем локальном сервере apache XAMPP в корневом каталоге, и он работает на 100% правильно. Однако, когда я пытаюсь развернуть на Heroku, это не работает. Я пробовал немного модифицированные версии этого, найденные в Интернете, чтобы сделать то же самое, но ни одна из них, похоже, не работает. Это должно удалить .php расширения файлов и разрешить такие вещи, как /api/products/all где файл api.php существует и products/all просто читаются с помощью PHP $_SERVER['PATH_INFO'] и результат возвращается в зависимости от того, что они есть.

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

Я не знаю тонны о .htaccess так что любая помощь будет оценена.

Это должно удалить расширения файлов .php

Ну, строго говоря, этот код предназначен для Добавить то .php расширение файла снова (для маршрутизации URL-адреса). (Вы уже "удалили" его, запросив /api/products/all.)

Однако этот код делает не то, что вы думаете. Это работает только на вашем локальном сервере из-за MultiViews строка (часть mod_negotiation). Код mod_rewrite, который следует ниже, вообще ничего не делает, возможно, поэтому это не работает для вас на Heroku?

Если разрешено выполнение директив mod_rewrite (т.е. если MultiViews был отключен) то это перепишет запрос на /api/products/all к /api/products/all.php, что явно неверно в данном примере.

Я не знаю, какие другие форматы URL-адресов вы пытаетесь обработать, но для конкретной маршрутизации URL-адреса формы /api/products/all к /api.php/products/all используя mod_rewrite, вам потребуется что-то вроде следующего:

RewriteEngine On
RewriteRule ^(api)/(.+) $1.php/$2 [L]

В RewriteCond директивы не требуются, если вы сопоставляете только этот конкретный URL.

... и "продукты / все" просто читаются с помощью php

Это называется дополнительным информация о пути и управляется / собирается сервером и передается на PHP в PATH_INFO элемент $_SERVER суперглобальный. Разрешена ли вообще информация о пути, зависит от сервера. (В противном случае такие URL-адреса привели бы к ошибке 404.)

ОБНОВЛЕНИЕ №1:

... если у меня также есть файлы, такие как example.js.php (где я использую код php, но визуализирую их как файлы javascript), и я бы хотел, чтобы их .php был удален, чтобы к ним можно было получить доступ через example.js, как бы Я изменяю правило перезаписи?

Вы можете добавить дополнительный блок правил, например:

RewriteCond %{DOCUMENT_ROOT}/$1.$2.php -f
RewriteRule (.+)\.(js)$ $1.$2.php [L]

Это перехватывает все запросы на .js файлов и перезаписывает запрос на соответствующий .js.php файл, если он существует.

В качестве альтернативы вы можете указать RewriteCond директива вроде этой:

RewriteCond %{REQUEST_FILENAME}.php -f

Обратите внимание, что если ваш .js файлы также расположены по URL-пути, который начинается /api/ тогда это правило нужно будет оставить перед приведенное выше правило, которое направляет ваши вызовы api, чтобы избежать конфликта.

ОБНОВЛЕНИЕ №2: Вам также может потребоваться установить правильный MIME-тип для этих ресурсов. (Работает это или нет с неправильным типом mime, зависит от браузера.) .js URL-адрес внутренне переписывается в сценарий PHP (т. Е. .js.php) Apache, естественно, обслужит это с помощью text/html mime-type (как и для всех файлов PHP по умолчанию). Вы можете либо убедиться, что вы явно устанавливаете правильный Content-Type заголовок из вашего скрипта или установите его в .htaccess используя Header директива (mod_headers). Например:

<FilesMatch "\.js.php$">
    Header set Content-Type "application/javascript; charset=UTF-8"
</FilesMatch>

Обратите внимание, что это будет работать только на Apache 2.2.12+ (до этой версии просто невозможно было установить Content-Type заголовок с Header директива).

Также обратите внимание, что «более простой» метод установки mime-типа с помощью T флаг на RewriteRule не работает в каталоге /.htaccess контекст - он перезаписывается, когда процесс перезаписи начинается заново.