Скоро в отдела ще имаме нов колега занимаващ се със SEO на сайтовете които разработваме и администрираме. Едно от първите му изисквания бе да се преобразуват връзките в текущите страници. Тоест досега бяха / и все още са
/ http://example.com/cgi-bin/index.cgi?param1=1¶m2=2, а изискването е да са в така наречения seo friendly или slashed формат http://example.com/param1/1/param2/2. Тъй като начело с мен всички в отдела който оглавявам са непростимо мързеливи, когато се мисли нова идеология и структура на динамичен сайт стремежа е всичко да е максимално опростено и гъвкаво, за да може в бъдеще да се правят лесни промени, както и лесно поддържка. Това в случая доведе до някои неудобства, тъй като не искахме да променяме нищо по кода на страниците . На пръв поглед нещата изглеждат лесни, но изникнаха и следните въпроси :
- Различен брой и имена на параметри.
- Всички заявки отиват към един единствен скрипт /cgi-bin/index.cgi което не позволява други хитринки.
- Както казах вече се стрмим всичко да е универсално. Тоест гледах да избягаме варианта с 300 и по вече реда .htaccess файл .
- Други които не се сещам в момента, но излизаха постоянно в процеса на работа.
Решението на което се спрях в момента е следното :
В директивата <Directory> където се намират файловете за съответния домейн или вирутален хост се поставят опциите +FollowSymLinks и/или +SymLinksIfOwnerMatch, също и AllowOverride All . Във файла .htaccess добавяме :
#Включваме rewrite модула
RewriteEngine On
#Указваме базовата директория
RewriteBase /
#Пропускаме всички файлове с посочените разширения и поставяме условие да се отнася за заявки които не са файл или директория
RewriteCond %{REQUEST_FILENAME} !\.(css|jpg|gif|png|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#Тук условието съвпада, ако имаме подаден само 1 параметър
RewriteCond $3 =”"
RewriteRule ^([^/]+)/([^/]+)[/&]?(.*)$ /cgi-bin/index.cgi?$1=$2
# Отново условията за файловите разширения и типа подадена заявка
RewriteCond %{REQUEST_FILENAME} !\.(css|jpg|gif|png|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#Тук е интересното
това условие съвпада независимо от броя подадени параметри и съответно премахва символите “?” и “&”
RewriteCond $3 !=”"
RewriteRule ^([^/]+)/([^/]+)[/&](.*)$ /cgi-bin/index.cgi?$3&$1=$2
При мен всичко сработи и в момента го тествам. Има още идеи, като например използваните на RewriteMap с която могат да се правят невероятни магии
, при наличие на време ще опиша кое е крайното решение на което съм се спрял. Не претендирам да съм бил изчерпателен или безгрешен /това ми е първото ръководство/ , но бих се радвал на критики, мнения и препоръки.