Итак, у меня есть приведенный ниже код в моем файле .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
контекст - он перезаписывается, когда процесс перезаписи начинается заново.