Робота з Url у файлі .htaccess

Напишемо скріпт в файлі .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 або аналогічний залежно від вашої ОС) для детального діагностування.