• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

بخش rewrite در htaccess

Mehdi

مدیر بازنشسته
تاریخ عضویت
1 آگوست 2004
نوشته‌ها
5,601
لایک‌ها
49
محل سکونت
Anywhere
یکی از بهترین امکاناتی که اپاچی بهتون میده بهش mod_rewrite هستش که باعث میشه سایتتون خیلی تمیزتر بنظر بیاد و به عبارتی SEO بشه !!!

تو هرجایی که شما بخواید از mod_rewrite استفاده کنید نیاز دارید که کد
PHP:
 Options +FollowSymlinks
 RewriteEngine on
رو در فایل تون قرار بدید
بزارید یک مثال بزنم , میخوایم تمام صفحات پی اچ پی رو تبدیل کنیم به اچ تی ام ال :
PHP:
 Options +FollowSymlinks
 RewriteEngine on
 RewriteRule ^(.*)\.htm$ $1.php [nc]
در دستور بالا ما گفتیم هر فایل که فرمتش پی اچ پی بود تبدیلش کن به .htm ولی این دلیل براین نیست که فرمت فایل عوض میشه نه!!! بلکه به هردو صورت دسترسی به فایل امکان پذیر هست برای مثال اگه یه فایل file.php داشته باشیم هم میتونیم با اسم file.htm بهش دسترسی پیدا کنیم و هم از file.php .
[nc] : این دستور یعنی No Case یا همون case-insensitive

خوب فرض کنید اسم دومینمون رو عوض کردیم ولی فایل هامون همون قبلی ها هستن و میخوایم هرکسی تو دومین اولی یک فایل رو فراخوانی کرد ما همون فایل رو تو دومین دوم صدا بزنیم اینجور عمل میکنیم :
PHP:
 Options +FollowSymlinks
 rewriteengine on
 rewriterule ^(.+)\.htm$ http://persiandev.net/$1.php [r=301,nc]
301 یعنی مستقیما ریدایرکت شده , دستور بالا زمانی خوبه که یه سایت قدیمی داریم حالا میخوایم update کنیم با این کار حتی موتور های جستجو خودشون اتوماتیک اپدیت میکنن لینک رو !!!

بزارید یخورده جذاب تر کنیم , به این کد نگاه کنید :
PHP:
 Options +FollowSymlinks
 RewriteEngine on
 RewriteRule ^myfiles/(.+)/(.+).zip download.php?section=$1&filename=$2 [nc]

بزارید ساده بگم اگه شما عبارت (.+) رو مساوی با 1$ فرض کنیم ( 1$=(.+) )ما میتونیم چندین بار از این عبارت استفاده کنیم به این صورت که بار اول که از (.+) استفاده میکنیم مساوی با 1$ میگیریم در دفعه دوم مساوی با 2$ میگیریم و همینطور الا اخر .
در مثال بالا برای مثال اگه ما یه فایل در مسیر
کد:
http://Persiandev.net/download.php?section=appz&filename=Mehdi
داشته باشیم این لینک از ادرس زیر هم در دسترس خواهد بود :
کد:
 http://Persiandev.net/myfiles/appz/Mehdi.zip
بزارید یه مثال دیگه از همین نوع بزارم :
PHP:
 Options +FollowSymlinks
 RewriteEngine on
 RewriteRule ^blog/([0-9]+)-([a-z]+) http://Persiandev.net/blog/index.php?archive=$1-$2 [nc]
حالا اگه ادرس ارشیو وبلاگ ما بصورت :
کد:
 http://Persiandev.net/blog/index.php?archive=2006-aug
باشه تبدیل میشه به :
کد:
 http://Persiandev.net/blog/2006-aug
به همین سادگی میبینید که با کمی Regular Expression میتونید ادرس هاتون رو خیلی زیباتر کنید چند تا راهنما براتون میزارم تا راحت تر بتونید استفاده کنید :
PHP:
.           Any single character
[chars]     یکی ار کاراکترها میتونه این باشه برای مثال [A]
[^chars]    هیج یک از این کاراکتر ها نباشه برای مثال [^A]
text1|text2  همون کار or رو انجام میده

Quantifiers:
?           میتونه یک کاراکتر باشه و یا هیچ کاراکتری
*           هرچیزی میتونه باشه حتی اگه چیزی وجود نداشته باشه
+           حداقل یک کاراکتر وجود دارد

Grouping:
(text)	برای ساختن گروه بکار میره

Anchors:
^           شروع
$           پایان

Escaping:
\char		برای مثال برای درنظر نگرفتن علائمی مثل [] یا . یا غیره هست در این مواقع به عنوان دستور در نظر نمیگیره

بزارید یه مثال دیگه بزنیم
PHP:
 Options +FollowSymlinks
 RewriteEngine On
 RewriteRule ^get(.*) /public/download/download.php$1
در مثال بالا ما گفتیم هر ادرسی که بعد از download.php قرار گرفت تبدیلش کنه به ادرس برای مثال
اگه ادرسمون اینجوری باشه :
کد:
  http://Persiandev.net/downloads/download.php?myfile=Mehdi.zip
تبدیل میشه به :
کد:
  http://Persaindev.net/Get?myfile=Mehdi.zip

در مثال بعدی میخوایم دسترسی به پوشه هارو بگیریم از کاربر
PHP:
 Options +FollowSymlinks
 RewriteEngine on
 RewriteRule ^(.*)$ deny.php [nc]
تو قسمت بالا اگه کاربر بخواد به هر نحوی وارد یه پوشه بشه ریدایرکت میشه به deny.php
بزارید در مثال بعدی کاری کنیم که فقط به فایل های خاصی دسترسی داشته باشه و بجز اون هر فایلی خواست باز کنه ارور بده :
PHP:
 Options +FollowSymlinks
 RewriteEngine On
 rewritecond %{REQUEST_FILENAME} !^(.+)\.css$
 rewritecond %{REQUEST_FILENAME} !^(.+)\.js$
 rewritecond %{REQUEST_FILENAME} !file.php$
 RewriteRule ^(.+)$ /deny/ [nc]
تو دستور بالا ما گفتیم فقط به فایل های سی اس اس و جی اس و فایل file.php اجازه بده که توسط کاربر فراخوانی بشه در غیر اینصورت ریدایرکت کنش به پوشه /deny/ .

بزارید تو مثال بعدی قضیه HotLinking رو بگیم :
PHP:
 Options +FollowSymlinks
 # no hot-linking
 RewriteEngine On
 RewriteCond %{HTTP_REFERER} !^$
 RewriteCond %{HTTP_REFERER} !^http://(www\.)?Persiandev\.net/ [nc]
 RewriteRule .*\.(gif|jpg|png)$ http://Persiandev.net/hotlink.gif [nc]
خوب فکر نمیکنم زیاد لازم به توضیح باشه کد بالا هر درخواستی رو که برای لود کردن عکس با فرمت gif,jpg,png از یه سایت دیگه باشه عکس http://Persiandev.net/hotlink.gif نمایش داده میشه .

اضافه کردن WWW به ادرس سایت :
این کد این کار رو براتون میکنه :
PHP:
Options +FollowSymlinks
RewriteEngine on
rewritecond %{http_host} ^www\.Persiandev\.net [nc]
rewriterule ^(.*)$ http://Persiandev.net/$1 [r=301,nc]
در واقع یه نوع ریدایرکت هستش البته از نوع peremantly moved .

ترجمه سایت :
PHP:
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^(.*)-fr$ http://www.google.com/translate_c?hl=fr&sl=en&u=http://Persiandev.net/$1 [r,nc]
RewriteRule ^(.*)-de$ http://www.google.com/translate_c?hl=de&sl=en&u=http://Persiandev.net/$1 [r,nc]
RewriteRule ^(.*)-es$ http://www.google.com/translate_c?hl=es&sl=en&u=http://Persiandev.net/$1 [r,nc]
RewriteRule ^(.*)-it$ http://www.google.com/translate_c?hl=it&sl=en&u=http://Persiandev.net/$1 [r,nc]
RewriteRule ^(.*)-pt$ http://www.google.com/translate_c?hl=pt&sl=en&u=http://Persiandev.net/$1 [r,nc]
در کد بالا در صورتی که به اخر یک لینک یا ادرس یکی از کلمات de , -fr , -pr, -it- اضافه بشه توسط گوگل میتونید ترجمه کنید .

عوض کردن نوع لینک برای مثال نوع ادرس عکس :
PHP:
Options +FollowSymlinks 
RewriteEngine on 

RewriteRule ^pictures/(.*) http://Persiandev.net/getpicture.php?$1 [r]

نویسنده : مهدی صفری

[mehdisafary<@>yahoo.com]
 

first saeed

Registered User
تاریخ عضویت
25 آگوست 2005
نوشته‌ها
815
لایک‌ها
2
سن
42
محل سکونت
PubliC_HtmL
عالی بود
74.gif
 

Simple Clean

کاربر تازه وارد
تاریخ عضویت
16 آگوست 2005
نوشته‌ها
283
لایک‌ها
2
ممنون کامل بود ...
 

H_R

مدیر بازنشسته
تاریخ عضویت
30 مارس 2005
نوشته‌ها
3,298
لایک‌ها
17
سن
42
محل سکونت
North Pole
آقا این سایت پرشین دو خیلی سایت خوبی اه ها ! ، از آقامهدی هم ممنونم استفاده کردیم .
 

aboozar_a

کاربر تازه وارد
تاریخ عضویت
31 ژانویه 2005
نوشته‌ها
40
لایک‌ها
0
من با این اموزش یک مشکلی پیدا کردم
این دستور را زدم
PHP:
 Options +FollowSymlinks 
 RewriteEngine on 
 RewriteRule ^show/(.+) http://mydomain/ShowNews.php?Fld_new_no=$1 [nc]

وقتی این ادرس را می زنم
http://mydomain/show/478
کاملا ریداریکت می کنه به ادرس بالا نه اینکه صفحه را با همین ادرس نشون بده
باید چکار کنم که ادرس را در ادرس بار دیگه عوض نکنه و همین را هم نشان بده در ضمن
وقتی می خواهم
در
PHP:
RewriteRule ^show
show را بردارم که به نظر بیاد هیچ فولدری نیست با این دستور هم ارورو میگیره

PHP:
 Options +FollowSymlinks 
 RewriteEngine on 
 RewriteRule (.+) http://mydomain/ShowNews.php?Fld_new_no=$1 [nc]

راهنماییم کنید چه کنم؟
 

متالیک

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
31 مارس 2007
نوشته‌ها
2,133
لایک‌ها
286
تشکر. خیلی عالی بود.
 

شادمهر

کاربر تازه وارد
تاریخ عضویت
2 دسامبر 2004
نوشته‌ها
33
لایک‌ها
0
سن
49
محل سکونت
ایران-تهران
سلام :

ممنون از مقاله عاليتون ، يه درخواست داشتم :
دوستان ميتونند كدي يا دستوري را براي فايل هيت اكسس قرار بدهند كه مانع از ديدن سورس سايت بشه ؟

يعني وقتي كاربري از ie منوي ويوم و گزينه ويو سورس رو ميزنه سورس صفحه براش باز نشه .
ممنون از شما . منتظرم.
 

ali_oop

Registered User
تاریخ عضویت
28 جولای 2007
نوشته‌ها
731
لایک‌ها
41
مرسی آقا
ولی میشه بگید که چطوری میشه کاراکتر های فارسی و خط فاصله را هم اضافه کرد
مرسی
 

samic

کاربر تازه وارد
تاریخ عضویت
21 سپتامبر 2009
نوشته‌ها
10
لایک‌ها
0
سلام
من می‌خوام از htaccess استفاده کنم تا مثلا آدرس http://www.chalyavi.com/130 به http://www.chalyavi.com/?id=130 منتقل بشه
از دستور زیر استفاده کردم:

RewriteEngine On
RewriteRule ^([0-9]+)$ http://www.chalyavi.com/?id=$1
RewriteRule ^([0-9]+)/$ http://www.chalyavi.com/?id=$1

اما اتفاقی که می‌افته اینه که وقتی اون آدرس کوچک شده رو میزنم خود سرور آدرس رو به آدرس بزرگ تبدیل می‌کنه و آدرس بالای صفحه اتومات میشه http://www.chalyavi.com/?id=130 !!!

پس الان htaccess من داره کار میکنه اما مثل redirect برنامه نویسی (مثلا asp با javascript) عمل میکنه!

کجای کارم ایراد داره؟​
 

arashaliz

کاربر تازه وارد
تاریخ عضویت
25 جولای 2010
نوشته‌ها
1
لایک‌ها
0
سلام
سوالی که برای من پیش امده اینه که وقتی ما از مد ریرایت برای 1 صفحه اسنفاده میکنیم مشکلی نیست ولی اگر چند صفحه رو با یک فایل به یک پسوند ری رایت کنیم کار نمیکنه
AddDefaultCharset utf-8
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^([^/]*)\.html$ /?page=$1
RewriteRule ^gallery-([^/]*)\.html$ /gallery.php?page=$2
RewriteRule ^gallery-([^/]*)\.html$ /result.php?galleryitem=$1

این کار نمیکنه ولی اگر تغییر بدیم پسوند هارو درست کار میکنه
AddDefaultCharset utf-8
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^([^/]*)\.html$ /?page=$1
RewriteRule ^gallery-([^/]*)\.test1$ /gallery.php?page=$2
RewriteRule ^gallery-([^/]*)\.test2$ /result.php?galleryitem=$1
پیشاپیش ممنون از راهنمیاتون در این زمینه
 

safe mode

کاربر تازه وارد
تاریخ عضویت
26 دسامبر 2011
نوشته‌ها
1
لایک‌ها
0
سلام به همگی،
یک سئوال خیلی حیاتی داشتم، خواهش می کنم جواب بدید:
چطور باید به وسیله htaccess آدرس صفحات وب را از انگلیسی به فارسی تغییر داد، مثلا:
site.ir/forum را به site.ir/فروم
تبدیل کرد، چون در هاست از زبان فارسی برای فایل ها و فولدر ها پشتیبانی نمی شه!

ممنون می شم اگر به مشکل من رسیدگی کنید.
 
بالا