У меня есть проект, где все запросы отправляются в индекс. php с маршрутизацией в файле .htaccess.
К сожалению, это не работает в XAMPP Virtualhost.
Но когда я go в папку root и выполняю команду PHP -S 127.0.0.1:8080
или любой другой порт, система маршрутизации работает и. htaccess файл также работает.
Это доказывает, что с моим PHP кодом нет ничего плохого.
Чтобы уточнить: я могу достичь виртуального хоста, и он работает.
Но когда я добавляю /control
, он говорит "Объект не найден", потому что control.php
не существует. Но это должно привести меня к странице управления, потому что он должен отправить запрос на index.php
.
Удаление расширения. php работает, поэтому /client
работает, потому что есть файл с именем client.php
. Так что .htaccess не игнорируется на этом.
Я также попытался набрать несколько случайных вещей в файле .htaccess и посмотреть, не выдаст ли это ошибку сервера, и это действительно так. Это также доказывает, что Virtualhost не игнорирует файл .htaccess.
Мой файл .htaccess:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ /index.php?q=$1 [NC,L,QSA]
Файл httpd-vhosts.conf:
<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/example"
ServerName example.com
ServerAlias www.example.com
<Directory "C:\xampp\htdocs\example">
AllowOverride All
</Directory>
</VirtualHost>
Кто-нибудь знает решение этой проблемы?
С уважением,
РЕДАКТИРОВАТЬ 1
Я добавил к httpd-vhosts.conf
строку DirectoryIndex index.php
, и она выглядит так:
<Directory "C:\xampp\htdocs\example">
DirectoryIndex index.php
AllowOverride All
</Directory>
EDIT 2
После некоторого тестирования я обнаружил, что правило маршрутизации для /login
работает. Мой index.php
файл:
<?php
// For Routing, I use the library AltoRouter: https://altorouter.com/
session_start();
require '../vendor/autoload.php';
require __DIR__ .'/includes/PHP/logout.inc.php';
$router = new AltoRouter();
$router->map('GET', '/', function() {
require __DIR__ . '/homepage.php';
});
$router->map('GET', '/405', function() {
echo '405';
});
$router->map('GET', '/login', function() {
require __DIR__ . '/login.php';
});
$router->map('GET', '/beheer', function() {
require __DIR__ . '/beheer.php';
});
$router->map('POST', '/uitloggen', function() {
$confirmation = TRUE;
logout($confirmation);
});
$router->map('GET', '/client/[i:id]', function() {
require __DIR__ ."/client.php";
});
$router->map('GET', '/car/*', function() {
require __DIR__ . "/auto.php";
});
$match = $router->match();
if(is_array($match) && is_callable($match['target'])) {
call_user_func_array($match['target'], $match['params']);
} else {
echo '404';
}
Когда я изменил правило для /login
на echo 'login'
, оно фактически напечатало сообщение 'login', так что это также доказывает, что это работает, но не полностью по какой-то причине. И когда я изменяю правило /beheer
на /control
, (существует control.php
), а затем я изменяю строку require __DIR__ . '/control.php
на echo 'control
, она печатает сообщение «control». Таким образом, похоже, что XAMPP перенаправляет только на index.php
, если путь в URL-адресе действителен и существует. Любой способ решить это?
РЕДАКТИРОВАНИЕ 3 И РЕШЕНИЕ
Через некоторое время я понял, что могу также просто отправить все 404 ошибки index.php
файл, а затем обработать реальные 404 ошибки в файле index.php
.
Итак, я только что добавил: ErrorDocument 404 index.php
в файл .htaccess
.