PDA

View Full Version : حرفه ای: نحوه ایجاد Sub Domain توسط PHP



siavashsay
جمعه 08 دی 1391, 13:37 عصر
دوستان میخوام بدونم چطوری میشه برای اعضا ایجاد ساب دومین کرد !
مثلا اگر کسی عضو سایت شد بجای :
Your-site.com/JohnSmith
به اینصورت در بیاد :
johnsmith.Your-site.com
؟!
آیا براحتی قابل انجام هست ؟!
آیا اگر اینکار انجام شد به تدابیر امنیتی خاصی نیاز هست ؟!
با تشکر :)

MMSHFE
جمعه 08 دی 1391, 13:52 عصر
این کار با htaccess. به راحتی قابل انجامه. قبلاً درباره اش بحث شده. توی تاپیکها جستجو کنید.

siavashsay
جمعه 08 دی 1391, 14:16 عصر
جالب اینجاس گشتم .
و پیدا هم شد !
اما هر کدوم از تاپیک ها رو که باز کردم همه تقریبا همین جواب رو داده بودن ! ( با htaccess میشه - سوالت تکراری - جسجتو کن ) :))
آخرشم به یه آموزش درست نرسیدم :)
در هر صورت ممنون جناب شهرکی

MMSHFE
جمعه 08 دی 1391, 14:21 عصر
این لینک رو ببینید:
Create Subdomains on the fly with htaccess (http://stackoverflow.com/questions/586129/create-subdomains-on-the-fly-with-htaccess-php)
اینم کد htaccess. نمونه (اول باید کارهایی که توی لینک فوق گفته شده رو انجام بدین.


#Grab the subdomain from the domain
RewriteCond %{HTTP_HOST} ^([^.]+).hm2k.org$
#Make sure the subdomain is not www or example
RewriteCond %{1} !^(www|example)$
#Check if the directory actually exists before we go there
RewriteCond /home/hm2k/public_html/%1 -d
#This stops it from looping
RewriteCond %{REQUEST_FILENAME} !^/home/hm2k/public_html/
#Finally, this is the actual rewrite
RewriteRule (.*) /home/hm2k/public_html/%1/$1 [Last]

موفق باشید.

siavashsay
جمعه 08 دی 1391, 14:26 عصر
دیدم ! ممنونم !
اما یه نظر دیگه دارم جناب شهرکی ! اگر بخوام پنل هر کاربر رو طوری نشون بدم که متغیر Get نباشه چطوری باید اینکارو کرد !
مثلا URL تبدیل شه !
به عنوان مثال
Your-Site.com/index.php?id=JohnSmith
تبدیل بشه به :
Your-Site.com/JohnSmith
آیا باید برای هر کاربر پوشه ای جدا بسازم ؟!
یا میشه با همون متغیر کار کرد طوری که آدرس URL به صورت مورد دوم دربیاد ؟!

MMSHFE
جمعه 08 دی 1391, 14:36 عصر
نه پوشه جداگانه نمیخواد و با htaccess. و ویژگی Rewrite اون میشه. فقط باید rewrite_module رو فعال کنید (توی Wamp از منوی Apache گزینه Apache modules و بعد rewrite_module رو انتخاب کنید و توی بقیه هم فایل httpd.conf رو باز کنید و دنبال کلمه mod_rewrite جستجو کنید و از ابتدای خطی که پیدا میشه # رو حذف کنید و Apache رو Restart کنید.
حالا فایل htaccess. رو با این محتوا توی پوشه ریشه سایتتون بسازین:


RewriteEngine on
Options +FollowSymlinks
RewriteBase /yoursite
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.(css|pdf|gif|ico|jpg|js|png|swf|pdf|txt|php)$
RewriteRule ^(.*)$ index.php?id=$1 [L,QSA]

توی این کد فرض کردم شما سایتتون رو روی localhost توی پوشه yoursite گذاشتین. اگه اسم پوشه فرق میکنه، اون اسم رو بگذارین. ضمناً این فایل رو هم توی پوشه yoursite (یا پوشه خودتون) بگذارین نه توی ریشه localhost (یعنی www)
البته اگه بخواین از این کد توی هاست واقعی استفاده کنید، خطوط دوم و سوم یعنی:


Options +FollowSymlinks
RewriteBase /yoursite

رو باید حذف کنید.
حالا هرموقع بنویسید yoursite/JohnSmith میتونید توی کدتون ['GET['id_$ رو بخونید که مقدار JohnSmith توشه بدون اینکه کاربر متوجه بشه داره به روش GET براتون چیزی میفرسته و فکر میکنه یک پوشه براش ساختین.
موفق باشید.

engmmrj
جمعه 08 دی 1391, 14:57 عصر
من این url تو سایت شما دیدم باید چه کاری انجام بدم که اینجوری بشه url هام
http://www.xoogle.ir/22-%D9%85%D8%AD%D8%B5%D9%88%D9%84%D8%A7%D8%AA-%DA%AF%D8%B1%D9%88%D9%87-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B3%D8%A7%DB%8C%D8%AA-%DA%98%D9%88%DA%AF%D9%84.html

MMSHFE
جمعه 08 دی 1391, 15:09 عصر
همین کدی که بالا گذاشتم رو ببینید. کافیه با توابع کار با رشته و تفکیکش به کمک توابعی مثل explode و... برحسب کارکتر - یا سایر کارکترها، بخش موردنظرتون رو از ['GET['id_$ جدا کنید. برای مثال، توی همون لینکی که گذاشتین، فقط 22 اولش مهمه و بقیه اش صرفاً بخاطر SEO اضافه شده و هیچ کاری توی کدنویسی باهاش نداریم.

engmmrj
جمعه 08 دی 1391, 15:18 عصر
بعد لینک ها ی شما مثلا به این شکل است http://www.ncis.ir/download/13 اینو چه جوری میتونم اعمال کنم؟

MMSHFE
جمعه 08 دی 1391, 15:21 عصر
اینم مثل همونه فقط با explode برحسب کارکتر / تبدیل به آرایه شده و خونه اول بررسی میشه (download یا articles یا category و...) که تصمیم بگیرم کدوم ماژول سایت رو صدا بزنم و خونه بعدی هم که id هست که بدونم از جدول توی دیتابیس کدوم رکورد رو بیرون بکشم و بقیه کارها هم که مشخصه.
موفق باشید.

siavashsay
شنبه 09 دی 1391, 11:15 صبح
نه پوشه جداگانه نمیخواد و با htaccess. و ویژگی Rewrite اون میشه. فقط باید rewrite_module رو فعال کنید (توی Wamp از منوی Apache گزینه Apache modules و بعد rewrite_module رو انتخاب کنید و توی بقیه هم فایل httpd.conf رو باز کنید و دنبال کلمه mod_rewrite جستجو کنید و از ابتدای خطی که پیدا میشه # رو حذف کنید و Apache رو Restart کنید.
حالا فایل htaccess. رو با این محتوا توی پوشه ریشه سایتتون بسازین:


RewriteEngine on
Options +FollowSymlinks
RewriteBase /yoursite
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.(css|pdf|gif|ico|jpg|js|png|swf|pdf|txt|php)$
RewriteRule ^(.*)$ index.php?id=$1 [L,QSA]

توی این کد فرض کردم شما سایتتون رو روی localhost توی پوشه yoursite گذاشتین. اگه اسم پوشه فرق میکنه، اون اسم رو بگذارین. ضمناً این فایل رو هم توی پوشه yoursite (یا پوشه خودتون) بگذارین نه توی ریشه localhost (یعنی www)
البته اگه بخواین از این کد توی هاست واقعی استفاده کنید، خطوط دوم و سوم یعنی:


Options +FollowSymlinks
RewriteBase /yoursite

رو باید حذف کنید.
حالا هرموقع بنویسید yoursite/JohnSmith میتونید توی کدتون ['GET['id_$ رو بخونید که مقدار JohnSmith توشه بدون اینکه کاربر متوجه بشه داره به روش GET براتون چیزی میفرسته و فکر میکنه یک پوشه براش ساختین.
موفق باشید.
جناب شهرکی
بنده همه این کارها رو کردم اما وقتی میزنم
noget/johnsmith
(در اینجا noget اسم پوشه سایت هست ) ارور Not Found میده !
از این کد هم برای دریافت ID استفاده میکنم :


$id=$_GET['id'];
echo $id;

قضیه چیه ؟!

bestirani2
شنبه 09 دی 1391, 12:46 عصر
عزیز در ابتدای کار باید wildcard رو روی هاستت فعال کنی
برای این کار به قسمت تنظیمات httpd رفته و AliasServer

*.domain.com

رو اضافه کنید.
برای اطلاعات بیشتر تو گوگل بزنید Wilcard به همراه نام کنترل پنلی که استفاده می کنید
تا اینجا کار ساب دامین ها رو وارد کنید همشون باز میشند ولی صفحه پیشفرض بالا میاد
حالا برای اینکه بگیم کدام صفحه بیاد بالا از htaccess استفاده می کنیم مثلاْ تیکه کد زیر اطلاعات رو میفرسته index.php

RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php
این کاریه که تو یک فریم ورک باید انجام بدید.
برای نمونه سایتی رو که در این مورد من درست کردم
وقتی این رو وارد میکنید
http://admin.naghdblog.com/
اطلاعات کاربر admin رو نشون میده
در اینجا از همون htaccess بالا استفاده شده
دو خط اول میاد و بررسی میکنه اگه فایل یا فولدری موجود بود باز میکنه و اگه نبود درخواست رو میفرسته سمت index.php

siavashsay
شنبه 09 دی 1391, 23:02 عصر
دوست عزیز !
ممنونم بابت جوابتون !
اما بحث ما در مورد قضیه دوم هست ! یعنی your-stie.com/Johnsmith نه johnsmith.your-site.com
از طرفی جناب شهرکی در مورد localhost توضیح دادن ! بنده هم فعلا در حالت تست میخوام روی localhost Wamp تست بگیرم !
اما بازم ممنونم !:)
اما هنوز مشکلم حل نشده ! خطای Not Found میده !
سوالی که از جناب شهرکی دارم :
اگر ما پوشه ای در همون مسیر داشته باشیم سیستم چطوری پوشه رو از متغیر GET تشخیص میده ؟!
یعنی اگر یک پوشه داشته باشیم به اینصورت :
your-site.com/Users
سیستم چطوری میخواد تشخیص بده که USERS پوشه هست نه متغیر GET ؟
ممنون میشم اگه توضیح بدید :)

bestirani2
شنبه 09 دی 1391, 23:52 عصر
همانطور که در بالا گفتم در htaccess
کد زیر رو در بالاش اضافه کنید

RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
این تیکه کد میاد میگه اگه فایلی که وجود فیزیکی داره . مستقیم اجراش کن
در ادامه هم آمدیم گفتیم اگه پوشه یا فایلی وجود فیزیکی نداره به index.php مراجعه کنه

# otherwise forward it to index.php
RewriteRule . index.php

siavashsay
یک شنبه 10 دی 1391, 00:14 صبح
با تشکر
ممنونم ! حل شد !
اما یه تغییری باید توی کدتون میدادید :


RewriteRule . index.php

باید بشه :


RewriteRule ^(.*)$ index.php?id=$1 [L,QSA]

بنده یه جورایی کد شما و جناب شهرکی رو تلفیق کردم و درست شد !
کد نهایی که برای بنده عمل کرد :


RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule ^(.*)$ index.php?id=$1 [L,QSA]


با تشکر خیلی زیاد :)

حالا یک سوال دیگه ! در اینجا ما فقط یک متغیر GET داریم میگیریم !
اگر 2 یا چندتا بود چطور باید عمل کرد ؟!
یعنی در اینجا : your-site.com/JohnSmith
JohnSmith میشه متغیر GET['id'] ما !
حالا اگر خواستیم چند متغییر با GET بگیریم چطوری باید عمل کنیم ؟!
مثلا :


index.php?id=JohnSmith&number=123456&city=tehran

ما الان فقط ID رو میتونیم بگیریم که JohnSmith هست اما متغیرهای Number - City رو چطور بگیریم ؟! توی URL چطوری میشه ؟!

siavashsay
یک شنبه 10 دی 1391, 00:40 صبح
آقا اونم حل شد !
توسط تابع explode
URL رو به اینصورت دادم :
your-site.com/JohnSmith/123456/Tehran
توسط تابع Explode به ترتیب JohnSmith رو متغیر Name و 123456 رو متغیر Number و Tehran رو متغیر city عنوان کردم و کار کرد !
خیلی جالب و موثر بود
امیدوارم بقیه دوستان هم مورد استفاده قرار بدن :)
با تشکر از شما:)

bestirani2
یک شنبه 10 دی 1391, 02:13 صبح
مطمئنی

RewriteRule . index.php
عمل نکرد ؟
من الان کار میکنم و هیچ مشکلی ندارم
کدی که شما نوشتید محدود شده به id همونطور که خودتونم اشاره کردید
ولی اگه

RewriteRule . index.php
وارد بشه (اگه کدهایی هم به غیر از کدهای من وارد میکنید بگید ممکنه مشکل از اون باشه)
هر درخواستی سمت برنامه بیاد رو هندل میکنه
که این درخواست میتونه یک ساب دامین هم باشه و یا حتی یک دامین باشه که روی آی پی های ما ست شده

siavashsay
یک شنبه 10 دی 1391, 10:02 صبح
والله چی بگم !
وقتی کد شما :


RewriteRule . index.php

رو گذاشتم هیچ آی دی رو نشون نداد ! یعنی هیچ متغیر GET رو نگرفت ! اما وقتی کد جناب شهرکی رو گذاشتم درست شد !
حالا نمیدونم قضیه چی بود !
اما در نهایت اون کدی که شما وجناب شهرکی دادین رو تلفیق کردم که در بالا هم گذاشتم بخوبی کار کرد !
حالا یک سوال :
طبق گفته شما :

هر درخواستی سمت برنامه بیاد رو هندل میکنه
که این درخواست میتونه یک ساب دامین هم باشه و یا حتی یک دامین باشه که روی آی پی های ما ست شده
این چطوری میشه ؟!
یعنی من اگه بخوام این رو در WAMP و مثلا در پوشه http://localhost/test/noget تست کنم و مثلا ساب دامین درست کنم چطوری میشه ؟!
نمیدونم چطوری دقیق سوالم رو برسونم ! شاید اینی که الان میگم خیلی مضحک و آماتور باشه اما مثلا اینطوری میشه ؟
http://localhost/test/subdomain.noget/
؟ :))
میشه اون ساب دومین رو به من توضیح بدید توی لوکال هاست کجا درست میشه؟

MMSHFE
یک شنبه 10 دی 1391, 18:22 عصر
حالا یک سوال دیگه ! در اینجا ما فقط یک متغیر GET داریم میگیریم !
اگر 2 یا چندتا بود چطور باید عمل کرد ؟!
یعنی در اینجا : your-site.com/JohnSmith
JohnSmith میشه متغیر ['GET['id ما !
حالا اگر خواستیم چند متغییر با GET بگیریم چطوری باید عمل کنیم ؟!
مثلا :


index.php?id=JohnSmith&number=123456&city=tehran

ما الان فقط ID رو میتونیم بگیریم که JohnSmith هست اما متغیرهای Number - City رو چطور بگیریم ؟! توی URL چطوری میشه ؟!
یه راه حلش که کلی هست رو خودتون نوشتین (explode) اما یک راه دیگه هم هست:


RewriteEngine on
Options +FollowSymlinks
RewriteBase /yoursite
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.(css|pdf|gif|ico|jpg|js|png|swf|pdf|txt|php)$
RewriteRule ^([^\/]*)/([^\/]*)/([^\/]*)$ index.php?id=$1&number=$2&city=$3 [L,QSA]
RewriteRule ^([^\/]*)/([^\/]*)$ index.php?id=$1&number=$2 [L,QSA]
RewriteRule ^(.*)$ index.php?id=$1 [L,QSA]

همونطور که میبینید، اگه سه بخش وارد بشه، RewriteRule اول و اگه دو بخش وارد بشه، دومی و اگه یک بخش وارد بشه، سومی بکار میره. ضمناً وجود L (مخفف Last) باعث میشه هرکدوم از Ruleها برقرار بشه، جلوی اجرای Rule بعدی رو بگیره. برای مثال اگه توی دوتای اول L رو بردارین، همیشه Rule آخر اجرا میشه چون گفته *. یعنی هر کارکتری با هر تعداد تکرار که همیشه این شرط برقراره ولی دوتای بالایی میگن هر کارکتری بجز / با هر تعداد تکرار
پیشنهاد میکنم درباره htaccess بیشتر تحقیق کنید. مثلاً QSA یعنی Query String Also که در این حالت، اگه مثلاً یکی بنویسه yoursite/5/12/zahedan?code=2 آرایه GET_$ میشه:


'id' => 5,
'number' => 12,
'city' => 'zahedan',
'code' => 2

ولی اگه QSA رو نگذارین میشه:


'id' => 5,
'number' => 12,
'city' => 'zahedan&code=2'

یعنی Quesy Stringها ارسال نمیشه! یا مثلاً NC اگه بگذارین یعنی Not Case Sensitive یعنی اگه توی شرط Rule بگذارین [a-z] شامل A-Z هم میشه و...
کلاً دنیاییه این htaccess. واسه خودش.

siavashsay
یک شنبه 10 دی 1391, 20:36 عصر
جناب شهرکی لطف میکنید منابعی که میشه ماهیت htaccess و مخصوصا این دستورها رو مرور و یادگیری کرد و معرفی کنید ؟!
خیلی خیلی ممنون میشم !
و واقعا ممنونم از لطفتون در مورد این تاپیک چون خیلی کارمو راه انداخت !

bestirani2
یک شنبه 10 دی 1391, 20:38 عصر
والله چی بگم !
وقتی کد شما :


RewriteRule . index.php

رو گذاشتم هیچ آی دی رو نشون نداد ! یعنی هیچ متغیر GET رو نگرفت ! اما وقتی کد جناب شهرکی رو گذاشتم درست شد !
حالا نمیدونم قضیه چی بود !
اما در نهایت اون کدی که شما وجناب شهرکی دادین رو تلفیق کردم که در بالا هم گذاشتم بخوبی کار کرد !
حالا یک سوال :
طبق گفته شما :

این چطوری میشه ؟!
یعنی من اگه بخوام این رو در WAMP و مثلا در پوشه http://localhost/test/noget تست کنم و مثلا ساب دامین درست کنم چطوری میشه ؟!
نمیدونم چطوری دقیق سوالم رو برسونم ! شاید اینی که الان میگم خیلی مضحک و آماتور باشه اما مثلا اینطوری میشه ؟
http://localhost/test/subdomain.noget/
؟ :))
میشه اون ساب دومین رو به من توضیح بدید توی لوکال هاست کجا درست میشه؟

فکر نمی کنم رو لوکال بشه ، اگر بشه من بلد نیستم
برای سرور هم حتماً یا باید اختصاصی باشه و یا VPS که بتونید تنظیمات مورد نظرتون رو اعمال کنید

MMSHFE
یک شنبه 10 دی 1391, 20:39 عصر
برای لوکال باید VirtualHost توی httpd.conf بسازین.

bestirani2
دوشنبه 11 دی 1391, 06:55 صبح
برای لوکال باید VirtualHost توی httpd.conf بسازین.

کلاْ روش ساختش همین هست

ولی رو لوکال من نتونستم بیارم بالا
چون نیاز نداشتم دنبالشم نرفتم

کد زیر واسه من کار نکرد ولی اگه تو سرور باشه و اسمش رو با دامین عوض کنم کار میکنه .


<VirtualHost *:80>
DocumentRoot D:\Project\naghdblog\htdocs
ServerName localhost
ServerAlias *.localhost
</VirtualHost>