Пайдаланушы белгілі бір URL мекенжайын шолғышқа теріп, Enter пернесін басқанда, осы сұрауды қабылдайтын веб-сервер файлды URL мекенжайында көрсетілген жолда серверде алуға тырысады. Жолда ештеңе көрсетілмесе, index.html немесе index.php сияқты индекс файлы ашылады. Егер ештеңе табылмаса, 404 қатесі қайтарылады. Егер бәрі қазіргідей жұмыс істемесе, бізде әдемі және оңай оқылатын URL мекенжайлары болмас еді. Бұл мекенжайлар көптеген сайттарда қолданылады. Apache mod rewrite модулі осы мәселені шешуге арналған. Бұл нұсқаулықта біз оны қалай қосуға болатынын қарастырамыз.
Егер бәрі сипатталғандай жұмыс істесе, онда осы сайттың кез келген сілтемесін түбірлік каталогта ашқан кезде мекенжай жолағынан бірдей атпен файл немесе сценарий болуы керек. Бірақ бұл олай емес. Осы URL мекенжайын сұраған кезде веб-сервер мұндай файлды табуға әрекет жасайды, бірақ егер ол оны таппаса, 404 қатесін қайтарудың орнына басқару mod_rewrite модуліне ауыстырылады, ол барлық осындай URL мекенжайлары үшін доменнен кейін сұрау жолын өткізіп, index.php сценарийін орындайды. Осыдан кейін PHP осы деректер негізінде пайдаланушыға қажетті бетті тауып қайтарады.
Модты қайта жазуды қосу үшін қарапайым пәрменді орындаңыз:
$ sudo a2enmod rewrite
Веб-серверді қайта іске қосқаннан кейін:
$ sudo systemctl restart apache
Модульдің Apache веб-сервер деңгейінде қосулы болуы оның веб-сайт үшін жұмыс істейтінін білдірмейді. Мұны істеу үшін оны .htaccess файлында конфигурациялау керек, жоқ беттерге сұрауларды жіберу үшін қандай сценарийді көрсетіңіз. .htaccess файлы жұмыс істеуі үшін виртуалды хосттың Каталог бөліміне AllowOwerride: All
директивасын қосу керек.
Мысал ретінде:
Келесі, мысалы, WordPress-те .htaccess файлына келесі жолдарды қосу керек:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
Барлық код IfModule директивасында орналастырылған, ол ішіндегі кодты mod_rewrite модулі қосылғанда ғана орындауға мүмкіндік береді, әйтпесе бұл жолдар жай еленбейді. RewriteEngine On директивасы ағымдағы каталог үшін модульді қосады. Содан кейін, RewriteBase көмегімен доменнен кейінгі бүкіл жолды сценарийге жіберу керек екені көрсетіледі. Содан кейін қатаң ретпен орындалатын RewriteCond шарттары бар RwriteRule ережелері келеді.
RewriteRule ^index.php$ - [L]
ережелерінің бірі URL мекенжайында index.php болса, URL мекенжайын / етіп қайта жазу керек екенін айтады. Бұл тұрақты өрнекте бүкіл жол көрсетілген және нүкте кері қиғаш сызықпен шығарылады. [L]
жалаушасы URL мекенжайы осы ережеге сәйкес келсе, келесі ережелерді тексеруге болмайтынын білдіреді. Бұл ереже орындалғаннан кейін URL мекенжайы қайта жазылады және веб-сервер / сұрауын алды деп ойлайды, ережелерді талдау басынан басталады және бұл жолы ол соңғы ережеге сәйкес келеді.
RewriteCond шарттары барлық келесі ережелерге қолданылады. Сондықтан бізде URL файл немесе қалта болмаса ғана соңғы ережені орындауға мүмкіндік беретін RewriteCond %{REQUEST_FILENAME} !-f
және RewriteCond %{REQUEST_FILENAME} !-d
бар. Соңғы ереже барлығын ./index.php сценарийіне қайта бағыттайды.
Егер mod_rewrite параметрлерін анықтай алмасаңыз, қайта бағыттау кезінде веб-серверде не болып жатқанын қарастырған жөн. Мұны істеу үшін сайттың виртуалды хост конфигурациясына келесі жолды қосыңыз.
Мысалы:
$ sudo vi /etc/apache2/sites-available/001-texts.conf LogLevel warn rewrite:trace4
Содан кейін ErrorLog директивасында берілген журнал файлында сіз веб-сервердің URL мекенжайын ережелеріңізге сәйкес түрлендіру әрекетінің барлығын көресіз және не істеп жатқаныңызды түсіне аласыз. Бұл нұсқаулықта біз Apache режимін қайта жазуды қалай қосу керектігін, сондай-ақ оның барлығы қалай жұмыс істейтінін және қателерді қалай іздеу керектігін қарастырдық.