Напишемо скріпт в файлі .htaccess який буде переадресовувати запити /url на відповідний PHP файл url.php, а якщо файл url.php не існує, то переадресовувати на файл 404.php
RewriteEngine On # Перевіряємо, чи запит йде до URL виду /url RewriteCond %{REQUEST_URI} ^/([^/]+)$ RewriteCond %{DOCUMENT_ROOT}/%1.php -f RewriteRule ^(.*)$ /$1.php [L] # Якщо файл не існує, переадресовуємо на 404.php RewriteCond %{REQUEST_URI} ^/([^/]+)$ RewriteCond %{DOCUMENT_ROOT}/%1.php !-f RewriteRule ^(.*)$ /404.php [L]
Як це працює:
Перша умова:
RewriteCond %{REQUEST_URI} ^/([^/]+)$ — перевіряє, чи є запит до URL вигляду /url. RewriteCond %{DOCUMENT_ROOT}/%1.php -f — перевіряє, чи існує файл url.php у кореневій директорії. Якщо умови виконуються, URL перенаправляється на відповідний файл PHP.
Друга умова:
Якщо файл url.php не існує, переадресовуємо запит на 404.php.
Додатково:
Переконайтеся, що у вас ввімкнений модуль mod_rewrite у конфігурації сервера Apache. Якщо 404.php повинен знаходитися у певному підкаталозі, змініть шлях у відповідному правилі.
Помилка 500 Internal Server Error зазвичай виникає через помилки у конфігурації .htaccess. Давайте перевіримо код і виправимо можливі проблеми.
Оновлений .htaccess файл
RewriteEngine On # Якщо файл або директорія існують, пропускаємо запит RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # Перевіряємо, чи є запит типу /url RewriteCond %{REQUEST_URI} ^/([^/]+)$ RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^(.*)$ /$1.php [L] # Якщо файл не існує, переадресовуємо на 404.php RewriteCond %{REQUEST_URI} ^/([^/]+)$ RewriteCond %{DOCUMENT_ROOT}/$1.php !-f RewriteRule ^(.*)$ /404.php [L]
Зміни:
Перша перевірка:
Додано правило, яке дозволяє серверу обробляти запити до існуючих файлів та директорій без втручання mod_rewrite.
Перевірка імен файлів:
Забезпечено правильну перевірку на існування файлу PHP.
Скориговано умови:
Умова RewriteCond %{DOCUMENT_ROOT}/%1.php -f правильно обробляє файли.
Дії для виправлення:
Перевірте наявність модуля mod_rewrite:
У файлі конфігурації Apache (зазвичай httpd.conf або apache2.conf), переконайтеся, що модуль увімкнено: sudo a2enmod rewrite sudo systemctl restart apache2
Перевірте дозволи на файли:
Усі файли та директорії повинні мати відповідні права доступу. Наприклад: chmod 644 *.php
Увімкніть відображення помилок Apache.
Увімкніть журнал помилок, щоб побачити точну причину:
LogLevel debug ErrorLog ${APACHE_LOG_DIR}/error.log
Перевірте конфігурацію Apache
Переконайтеся, що віртуальний хост дозволяє використання .htaccess:
<Directory /path/to/your/site> AllowOverride All </Directory>
Після внесення змін перезапустіть сервер Apache:
sudo systemctl restart apache2
Якщо проблема залишається, перегляньте журнал помилок Apache (/var/log/apache2/error.log або аналогічний залежно від вашої ОС) для детального діагностування.