PDA

View Full Version : سوال: مشکل عجیب در httaccess



bachemahal
جمعه 22 خرداد 1394, 18:18 عصر
با سلام
داخل فایل httaccess الگوی RewriteRule من به صورت زیر می باشد


RewriteRule ^(\w+)/(\w+)/(.+)$ ./controllers/$1controller.php?action=$2&param1=$3


پارامتر سوم (.+) که به معنی قبول کردن همه کاراکترها از ورودی میباشد وقتی حروف فارسی می نویسم یا انگلیسی هیچ مشکلی نیست چیز عجیب اینجاست که اگه داخل پارامتر مورد نظر کاراکتر م فارسی باشد با خطای 404 روبه رو می شم می خواستم ببینم کسی تا به حال با این مشکل برخورد کرده.

abolfazl-z
شنبه 23 خرداد 1394, 00:44 صبح
اون ادرسی که تبدیل می شود را بگذارید اینجا ببینیم + کد کامل htaccess

bachemahal
یک شنبه 24 خرداد 1394, 10:55 صبح
آدرسی که خطا نمیده

http://127.0.0.1:1396/news/detail/کار (http://127.0.0.1:1396/news/detail/%DA%A9%D8%A7%D8%B1/3)

آدرسی که خطا میده

http://127.0.0.1:1396/news/detail/مار (http://127.0.0.1:1396/news/detail/%DA%A9%D8%A7%D8%B1/3)


کد httaccess



RewriteEngine On


AddDefaultCharset utf-8
DefaultLanguage fa-IR




RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(\w+)/(\w+)/(.+)$ ./controllers/$1controller.php?action=$2&param1=$3

abolfazl-z
یک شنبه 24 خرداد 1394, 16:07 عصر
نگاه کنید من تست کردم و از لحاظ منطقی درست عمل کرد و هیچ مشکلی نداشت.

در دو صورت خطا نشان می دهد :

1. زمانی که پترن شما درست عمل نکند

2. فایل درخواستی یافت نشود

حالا برای اینکه مطمئن شوید باید تست کنید.

بجای آدرس ./controllers/$1controller.php?action=$2&param1=$3 یک فایل test.php درست کنید و آدرس اش را بجای آن بگذارید و خروجی را ببینید. (برای هر دو آدرس تست کنید)


test.php?out=$1-$2-$3

test.php

<?php
print_r($_GET);
?>

یک سوال دیگر ؟ مطمئن هستید آدرس controllers/$1controller.php? درست هست ؟ اون 1$ همان news می شود. یعنی آدرس زیر وجود دارد ؟


controllers/newscontroller.php

bachemahal
یک شنبه 24 خرداد 1394, 18:00 عصر
ممنون از پاسخگوییتون
فرمایش شما صحیح، اما همونطور که گفتم آدرس اول بدون مشکل باز میشه، پس فایل درخواستی پیدا میشه و آدرس هم درسته.
سوال من درواقع اینه که چرا پترن (.+) که شامل همه کاراکترها میشه و همه فارسی ها هم قبول میکنه، حرف م رو نمیشناسه.
برای مطمئن شدن پترن زیر رو هم گذاشتم و درست عمل کرد.

([a-z0-9ما-ی]+)

یعنی علاوه بر تمامی الفبای فارسی و انگلیسی حرف م جدا آوردم و صفحه باز شد!

abolfazl-z
یک شنبه 24 خرداد 1394, 21:53 عصر
شما تست های لازم را انجام دهید و این دلیل ها باعث نمیشه که تست نکنید ! شاید اسکریپت داره خطای 404 به کلاینت می دهد.

فقط آدرس را تغییر دهید به یک فایل دیگر در دو حالت تست کنید و خروجی را اینجا بگویید.

حالت اول


RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule (.*) test.php?test=$1

حالت دوم

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(\w+)/(\w+)/(.+)$ test.php?action=$1-$2-$3

درضمن من به آپشن های زیر مشکوکم !


AddDefaultCharset utf-8
DefaultLanguage fa-IR

این ها را به حالت comment ببرید.

فایل test.php را مثل بالا کد نویسی کنید.

bachemahal
یک شنبه 24 خرداد 1394, 22:23 عصر
حالت اول که یک پترن بیشتر نداریم و درواقع کدتون رو به کد زیر اصلاح کردم
RewriteRule (.*) test.php?action=$1
نتیجه این شد که جایی که م داره تو آدرس کاراکتر ناشناس بصورت زیر نمایش داده شد

تو حالت دوم هم که اصلا به صفحه نمیره
AddDefaultCharset utf-8

DefaultLanguage fa-IR
هم برداشتم مشکل رو حل نکرد

abolfazl-z
یک شنبه 24 خرداد 1394, 23:17 عصر
نتیجه این شد که جایی که م داره تو آدرس کاراکتر ناشناس بصورت زیر نمایش داده شد

من پست بالا را ویرایش کردم.

فایل htaccess


RewriteCond %{SCRIPT_FILENAME} !-d

RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule (.*) test.php?test=$1

در فایل test.php محتوای زیر را قرار دهید :


<meta charset="utf8">
<?=var_dump($_GET['test'])?>

صفحه را از نوع utf8- without bom ذخیره کنید و همچنین اگر header نوع کدگذاری ست نشده(AddDefaultCharset utf-8) حتما از طریق html برای مشاهده صحیح متن از <meta charset="utf8" > استفاده کنید.


اگر اشتباه نکنم مشکل در نوع ارسال داده است که ممکن از طرف کلاینت باشه یا از طرف apache (یک نوع دستکاری داده)

خروجی را بصورت text/plain بگذارید حتما (در mozilla میتونی بر روی صفحه راست کلیک کرده و گزینه view page source را بزنی)