رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
ایجاد لینک های مناسب با سئو در زبان پایه PHP
#1
به نام خدا 
عرض سلام و خسته نباشید خدمت مدیران محترم این انجمن به خصوص جناب مهندس شهرکی عزیزم.


من یک پروژه کوچک نوشتم برای یاد گیری پی اچ پی به صورت عملی و نیازمند کمک شما عزیزان می باشم.

در این پروژه که متصل به دیتابیس نیز می باشد دو جدول دارم جدول user و product تشریح می کنم که جدول user اطلاعات کاربران مرا در بر دارد و جدول files اطلاعات فایل هایی که درون آن درج کردم.

از آنجایی که این برنامه کوچک من به منظور ارائه یک سری فایل تولید شده داخل سیستم یک ناوبار تعریف کردم که در ناوبار دو لینک درج شده به فرض مثال :
لینک اول هست 
عینک ریبن
و لینک دوم 
عینک پلیس 

مثلا ! 

حالا من چیزی که فکر کردم این بوده که اگر قرار باشه من برای هر کدام از لینک محصولاتم یه فایل خاص پی اچ پی بخوام تولید کنم که خیلی بد میشه ! مثلا فکر کنید این طوری باشه 
eynak-reyban.php
eynak-police.php
خب این خیلی ضایع هست که من خواسته باشم برای هر کدوم از محصولاتم یه فایل پی اچ پی درست کنم و بعد 
داخل هر فایل header.php footer.php و config.php رو فراخوانی کنم داخل هر فایل مجزا بخوام کوئری بزنم
و از این مدل کار ها. 
بنابراین به این فکر افتادم چه طوری میتونم پیج های داینامیکی طراحی کنم که که بتونم ازشون استفاده کنم به صورت عادی چیزی که به ذهنم میرسه مثلا تو گوگل که سرچ می کردم این طوری لینک درست می کردن

site.com/index.php?product=eynak-reyban
یا این طوری مثلا 
site.com/product.php?id=10

ولی خب مدل لینک ها برای سئو مناسب نیست برای همین من میخوام به این شکل باشه 

site.com/product/eynak-reyban

که باز دیده میشه بعضی از افراد همین لینک منو این طوری تنظیم می کنن
site.com/index/product/eynak-reyban
که من نمیخوام این شکلی باشه میخوام کاربر index رو وارد نکنه بدون وارد کردن  index به راحتی بعد از نام دامین بزنه مثلا product لیست محصولات بیاد یا اگر زد contact مثلا تماس با ما میاد این طوری بگم مثل سیستم های مدیریت محتوا میخوام داینامیک قابل تعریف باشه به همین جهت نیازمند کمک هستم که بتونم این مراحل رو هم از سمت دیتابیس هم از سمت کد انجام بدم نیازمند همراهی و همکاری شما عزیزان هست در نهایت انجام وتوضیح در این رابطه این یک مطلب مفید میشه که میتونه به درد خیلی ها بخوره چون به زبان فارسی مطلب کاملی در این باره ندیده بودم.
امیدوارم که تمیز متوجه منظورم شده باشید درنهایت توضیحات هدفم اینه که برگه هایی داینامیک تولید کنم با یک ظاهر مشابه به همه سایت اما متون و مطالبی متفاوت که لینک اجرای صفحات به مناسب سئو باشه.
باتشکر
پاسخ
تشکر شده توسط:
#2
راه مناسب اینه که تمام درخواست‌هایی رو که صراحتاً به یک فایل (مثل تصویر یا CSS یا JS یا PHP و...) و یا یک پوشه‌ی مشخص اشاره نمیکنن، ارجاع بدین به فایل index.php

این‌کار ازطریق ایجاد یک فایل بدون نام با پسوند htaccess (بطور خلاصه یک فایل با اسم .htaccess) در محل ریشه‌ی سایتتون (کنار index.php) و درج محتوای زیر داخلش انجام میشه:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?r=$1 [L,NC,QSA]

حالا توی سایتتون اگه فرضاً مسیر mysite.com/product/eynak-reyban رو اجرا کنید، عملاً فایل index.php داره اجرا میشه و هر چیزی که جلوی آدرس ریشه‌ی سایت نوشته شده تحت‌عنوان متغیر $_GET['r'] برای این اسکریپت فرستاده میشه. مثلاً در این حالت اگه توی index.php دستور زیر رو اجرا کنید:
echo $_GET['r']; // output: product/eynak-reyban

خروجی طبق کامنتی که توی کد گذاشتم خواهد بود. حالا میتونین برای مثال با تابع explode خروجی رو تفکیک کنید:
$route = explode('/', trim($_GET['r'], '/')); // $route = ['product', 'eynak-reyban']

اینطوری عملاً یک اسکریپت نقطه‌ی ورودی تمام درخواست‌هاست و براساس پارامتری که توی URL قرار میگیره، میتونه تصمیم بگیره که چه بخش‌های دیگری از سایت رو فراخوانی کنه. این تکنیک به ساخت URLهای SEO Friendly معروفه.
پاسخ
تشکر شده توسط: HTayebi
#3
نمونه‌ی اسکریپت رو ضمیمه کردم.


فایل‌های پیوست
.zip   rewrite.zip (اندازه 1.14 KB / تعداد دانلود: 2)
پاسخ
تشکر شده توسط: HTayebi
#4
خیلی ممنون مهندس جان سوالی که دارم اینه که r رو چه طوری تعریف کردیم داخل $_GET ؟
یعنی این r از کجا اومده ؟
پاسخ
تشکر شده توسط:
#5
به فایل htaccess. دقت کنید. جلوی index.php نوشته شده (توی خط آخر)
پاسخ
تشکر شده توسط: HTayebi
#6
درست میرم کد ها رو تحلیل می کنم در صورت وجودمشکل راهنمایی میگیرم و در صورت عدم مشکل پروژمو تکمیل کنم قطعا اینجا با توضیحات کامل و جامع یا حتی در قالب یه فیلم آموزشی همراه با صدا و تصویر اینجا درج می کنم.
باتشکر
پاسخ
تشکر شده توسط:
#7
مهندس جان از اونجایی که من روی xampp پروژه رو تست می کنم روی لوکال وقتی آدرس رو به این شکل باز می کنم مثلا

site.com/index/page

خطا میده که این فایل پیدا نشد اما در صورتی که بزنم

site.com/index.php/page

چون متغیر get رو چاپ کردیم تو index خب اطلاعات رو بر می گردونه و درسته من میخوام بدون استفاده از .php داخل آدرس بتونم آدرس ها رو فراخوانی کنیم به چه شکلی میشه این حالت ؟ البته میخوام نیاز به وارد کردن خود index نباشه به صورت کلی
مثلا این طوری بشه آدرس رو وارد کرد که خودش index رو تخیص بده به هر صورت

site.com/contact
site.com/product/eynak-reyabn

باتشکر
پاسخ
تشکر شده توسط:
#8
راستی مهندس جان امکانش هست این رو تشریح کنید برام ؟


1 -   چه کاری می کنه ؟ RewriteEngine On
2 -  این ریورایت بیس و  سرور به چه معنی هست RewriteBase /server
3 -  این به چه معنی هست ؟ RewriteCond %{REQUEST_FILENAME} !-l
4 -  این به چه معنی هست ؟  RewriteCond %{REQUEST_FILENAME} !-f
5 -  این به چه معنی هست ؟  RewriteCond %{REQUEST_FILENAME} !-d
6 -  RewriteRule ^(.*)$ index.php?r=$1 [L,NC,QSA]
7 -  در خط آخر این عبارت یعنی چی ؟ L,NC,QSA
8 -  در خط آخر این .* چه مفهومی داره ؟
9 -  در خط آخر $ کنار پرانتز و $1 چه مفهومی داره ؟


سوال دیگری که برام پیش اومده این شکل نوشتن این دستور چه مفهومی داره ؟

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)?*$ index.php/$1 [L,QSA]


باتشکر از شما
پاسخ
تشکر شده توسط:
#9
سلام  Heart  این جا چه طور میتونیم کاری کنیم که اگر کاربرمون به فرض مثال آدرس رو این طوری زد 
site.com/
site.com/index
site.com/index.php
site.com/home
site.com/home.php

محتوای home.php نمایش داده بشه

if(isset($_GET['r']) && ($page[0]) == 'contact'){
  include 'contact.php';
}elseif (isset($_GET['r']) && ($page[0]) == 'blog') {
   include 'article.php';
}elseif (isset($_GET['r']) && ($page[0]) == 'aboute-us') {
   include 'page.php';
}elseif (isset($_GET['r']) && ($page[0]) == 'home' || 'home.php' || 'index' || 'index.php' || '/') {
   include 'home.php';
}
else{
 include '404.php';
 //echo '<pre>' . print_r(explode('/', trim($_GET['r'], '/')), true) . '</pre>';
}



elseif (isset($_GET['r']) && ($page[0]) == 'home' || 'home.php' || 'index' || 'index.php' || '/') {
    include 'home.php';
}


کل index.php هم کدش اینه


<?php
define('main_load',1);
$HomeURL = str_replace('index.php','',$_SERVER['SCRIPT_NAME']);
$HomeURL = '/'.trim($HomeURL,'/');
define('HomeURL',$HomeURL);
include('header.php');
$page = explode('/', trim($_GET['r'], '/'));
if(isset($_GET['r']) && ($page[0]) == 'contact'){
 include 'contact.php';
}elseif (isset($_GET['r']) && ($page[0]) == 'blog') {
   include 'article.php';
}elseif (isset($_GET['r']) && ($page[0]) == 'aboute-us') {
   include 'page.php';
}elseif (isset($_GET['r']) && ($page[0]) == 'home' || 'home.php' || 'index' || 'index.php' || '/') {
   include 'home.php';
}
else{
 include '404.php';
}
include('footer.php');
پاسخ
تشکر شده توسط:
#10
(05-08-1396، 10:36 ب.ظ)HTayebi نوشته: راستی مهندس جان امکانش هست این رو تشریح کنید برام ؟

...

  1. این دستور ماژول Rewrite آپاچی رو روشن میکنه که وظیفه‌ی بازنویسی آدرس‌ها رو بعهده داره
  2. این دستور مسیر ریشه‌ی بازنویسی آدرس‌ها رو مشخص میکنه. مثلاً اگه جلوش نوشتیم /server یعنی اینکه هرجا بعداً نوشتیم index.php منظورمون فایل index.php در مسیر /server هست.
  3. این دستور یعنی یک شرط (Condition) برای Rewrite میگذاریم و اونم اینه که مسیر درخواستی، یک لینک نباشه (SymLink در سیستم‌عامل لینوکس یا Shortcut در ویندوز)
  4. این دستور یعنی مسیر درخواستی، مسیر دقیق یک فایل فیزیکی روی دیسک نباشه (مثل CSS یا JS یا PHP یا عکس و...)
  5. این دستور هم یعنی مسیر درخواستی، یک پوشه‌ی فیزیکی روی دیسک رو مشخص نکرده باشه (درواقع ترکیب این سه‌شرط داره میگه که مسیر درخواستی، مستقیماً به یک فایل یا پوشه اشاره نکنه. هدف از این شرط‌ها اینه که فایلهای CSS و... توی سورس، مستقیماً از سرور درخواست بشن و به index.php ارجاع داده نشن.
  6. این دستور داره میگه هرچی بعد از آدرس ریشه‌ی سایت اومده باشه رو (درصورتی که شرط‌های بالا رعایت شده باشن) بعنوان پارامتر r به‌روش GET برای index.php بفرست.
  7. سوئیچ L یعنی آخرین Rule و برای مواقعی کاربرد داره که چند قانون با یک مسیر مطابقت داشته باشه و اگه این سوئیچ رو نگذاریم، رول‌های بعدی هم پردازش میشن. NC یعنی حساس به بزرگی و کوچکی حروف نباشه و QSA هم یعنی سایر پارامترهایی که به روش GET توی URL مشخص میشن رو هم برای index.php بفرسته.
  8. درمورد Regular Expressions تحقیق کنید. عبارت .* یعنی هر کارکتری به هر تعداد
  9. توی Regular Expressions، کارکتر ^ توی الگو یعنی شروع رشته و $ یعنی پایان رشته. وقتی عبارتی رو توی پرانتز در قسمت اول RewriteRule گذاشتیم، میتونیم بعداً به‌ترتیب پرانتزها توی قسمت دوم با $1, $2, ... بهشون دسترسی پیدا کنیم.
پاسخ
تشکر شده توسط: HTayebi
#11
درمورد سؤال آخر بهتره اینطوری کار کنید:
$page = isset($_GET['r]) ? explode('/', trim($_GET['r'], '/')) : [];
$currentPage = strtolower($page[0]);
if (in_array($currentPage, ['contact', 'contact.php'])) {
    require_once __DIR__ . '/contact.php';
} elseif (in_array($currentPage, ['home', 'home.php'])) {
    require_once __DIR__ . '/home.php';
} ...
پاسخ
تشکر شده توسط: HTayebi
#12
مهندس جان خیلی ممنونم

به صورت کلی اگر خواسته باشم کاربر به فرض مثال زد index یا index.php محتوای فایل home.php نمایش داده بشه به چه شکلیه دقیقا مثل همین حالتی که نوشتین ؟ جواب میده چون من در حالت پیشفرض کاربر که آدرس سایت رو باز می کنه به فرض مثال 

site.com/
or
site.com/index
or
site.com/index.php

دقیقا محتوای فایل home  نمایش داده بشه البته بدون اینکه در آدرس بار مرورگر نوشته بشه  site.com/home یا site.com/home.php
 من زمانی که به شکلی که خودم گفتم می نوشتم همه صفحاتی که وجود نداشت رو به عنوان home در نظر میگرفت برای همین می پرسم.
پاسخ
تشکر شده توسط:
#13
کافیه بگین اگه $currentPage خالی بود، فایل home.php ضمیمه بشه:
if (in_array($currentPage, ['', 'index', 'index.php', 'home', 'home.php'])) {
    require_once 'home.php';
}
پاسخ
تشکر شده توسط: HTayebi
#14
خب واسه اینکه بهش 404 رو بفهونم چی ؟ ؟
پاسخ
تشکر شده توسط:
#15
توی else آخر، صفحه‌ی 404.php رو بگذارین. یعنی اگه آدرس درخواستی با هیچکدوم از شرایط شما مطابقت نداشت، اونوقت 404 بارگذاری بشه
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان