Робота з посиланнями другого рівня через .htaccess

Щоб .htaccess обробляв посилання другого рівня вкладення (наприклад, /url1/url2) і перенаправляв їх на url1/url2.php або на 404.php, потрібно внести наступні зміни в код, наведений в статті “Робота з Url у файлі .htaccess

Оновлений .htaccess файл:

RewriteEngine On

# Якщо файл або директорія існують, пропускаємо запит
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# Перевіряємо, чи є запит виду /url1/url2
RewriteCond %{REQUEST_URI} ^/([^/]+/[^/]+)$
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*)$ /$1.php [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]

Як це працює:

Обробка вкладених URL (/url1/url2):

Умова RewriteCond %{REQUEST_URI} ^/([^/]+/[^/]+)$ перевіряє, чи є URL двох рівнів.
Умова RewriteCond %{DOCUMENT_ROOT}/$1.php -f перевіряє, чи існує файл url1/url2.php.

Обробка однорівневих URL (/url):

Умова RewriteCond %{REQUEST_URI} ^/([^/]+)$ перевіряє, чи є URL одного рівня.
Умова RewriteCond %{DOCUMENT_ROOT}/$1.php -f перевіряє, чи існує файл url.php.

Обробка 404:

Якщо жоден з файлів не знайдено, перенаправляємо запит на 404.php.

Додаткові поради:

Якщо потрібна обробка більшої глибини вкладення (наприклад, /url1/url2/url3), можна використовувати регулярний вираз із зірочкою:
RewriteCond %{REQUEST_URI} ^/([^/]+(/[^/]+)*)$

Для налагодження правил можна тимчасово увімкнути відображення запитів:

RewriteLogLevel 3

Перевірте, чи працюють запити на двох рівнях, і чи коректно обробляються запити, які не знаходять відповідних файлів.

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

How to install SSH2 extension for PHP 7.4

If You have an error like: Call to undefined function ssh2_connect() that’s mean that in your PHP not installed ssh2 extension.

Install this extension is very simple, in Ubuntu Linux or other Debian based distribution just use the command:

sudo apt install php7.4-ssh2

This command will install ssh2 extension to Your PHP 7.4. If you use other PHP version, just change number in this command to Your version.

How to use Match in PHP 8

In PHP 8, the match expression was introduced as a more concise and powerful alternative to the switch statement. The match expression allows you to perform pattern matching against a value and execute code based on the matched pattern.

Here’s the basic syntax of the match expression:

match ($value) {
    pattern_1 => expression_1,
    pattern_2 => expression_2,
    // more patterns and expressions...
    pattern_n => expression_n,
    default => expression_default
};

Here’s how it works:

  • The $value is the expression that you want to match against.
  • pattern_1, pattern_2, and pattern_n are the patterns you want to match against the value. These can be literal values, constants, or expressions.
  • expression_1, expression_2, and expression_n are the expressions that will be executed if the corresponding pattern matches.
  • default is an optional keyword that specifies the default case when none of the patterns match. expression_default is the expression executed in the default case.

The match expression evaluates the value and compares it against each pattern in order. If a pattern matches, the corresponding expression is executed, and the match expression completes. If none of the patterns match, the default case (if provided) is executed. If no default case is provided and no pattern matches, a MatchError is thrown.

Here’s an example to illustrate the usage of the match expression:

$result = match ($value) {
    0 => 'Zero',
    1 => 'One',
    2, 3 => 'Two or Three',
    4, 5, 6 => 'Four, Five, or Six',
    default => 'Other'
};

In this example, the value of $value is matched against different patterns, and the corresponding expressions are executed based on the match. The result is assigned to the variable $result.

The match expression in PHP 8 provides a more expressive and concise way to perform pattern matching, making your code easier to read and maintain.

Disable exec, shell_exec, system, popen and Other PHP Functions To Improve Security

PHP has a lot of functions which can be used to crack your server if not used properly. You can set list of functions in php.ini using disable_functions directive. This directive allows you to disable certain functions for security reasons. It takes on a comma-delimited list of function names.

Open a terminal application or login to your server over the ssh session using ssh command. Open php.ini file using a text editor such as vim command or nano command:

sudo nano /etc/php/8.0/fpm/php.ini

Find disable_functions and set new list as follows:

disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

We also recommend to disable allow_url_include and allow_url_fopen for security reasons:

allow_url_fopen=Off
allow_url_include=Off

Restart PHP with command:

systemctl restart php8.0-fpm

Install Composer and Laravel

First install Composer package manager on on your project:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

php composer-setup.php

php -r "unlink('composer-setup.php');"

Now install Composer global:

php composer.phar global require laravel/installer

Install Composer to your project (change site-name to your project name):

php composer.phar create-project --prefer-dist laravel/laravel site-name "8.*"

How to install Composer on Linux server

Composer is a most popular PHP package manager, let’s install composer on website and watch how it works.

You can download Composer from official site: https://getcomposer.org/

Connect to your server via SSH client and run this commands:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

php composer-setup.php

php -r "unlink('composer-setup.php');"