จะตรวจสอบว่า mod_rewrite เปิดใช้งานใน php ได้อย่างไร?


149

ผมสงสัยว่าถ้ามันเป็นไปได้เพื่อตรวจสอบว่าmod_rewriteมีการเปิดใช้งานบนApacheและIISPHPใน

ModRewriteสำหรับ IIS มีอยู่ hereตรวจสอบ

ดังนั้นฉันกำลังมองหาสคริปต์ PHP ที่ตรวจสอบmod_rewriteในApacheและIIS

ไม่มีใครรู้สคริปต์ดังกล่าวหรือสามารถเขียนได้หรือไม่

โดยเฉพาะอย่างยิ่งสำหรับ Microsoft IIS

ขอบคุณ!

คำตอบ:


125

หากคุณกำลังใช้ mod_php apache_get_modules()คุณสามารถใช้ นี่จะส่งคืนอาร์เรย์ของโมดูลที่เปิดใช้งานทั้งหมดดังนั้นเพื่อตรวจสอบว่าmod_rewriteมีการเปิดใช้งานหรือไม่คุณสามารถทำได้

in_array('mod_rewrite', apache_get_modules());

น่าเสียดายที่คุณมักจะพยายามทำเรื่องนี้กับ CGI ซึ่งทำให้ยากขึ้นเล็กน้อย

คุณสามารถทดสอบโดยใช้สิ่งต่อไปนี้

strpos(shell_exec('/usr/local/apache/bin/apachectl -l'), 'mod_rewrite') !== false

หากเงื่อนไขข้างต้นประเมินเป็นtrueแล้วmod_writeจะเปิดใช้งาน


1
ฉันไม่รู้ เป็นการทดสอบว่าmod_rewriteมีการติดตั้งโมดูลหรือไม่ IIS Mod-Rewriteโมดูลคุณอาจหมายถึงเป็นสินค้าที่มีความแตกต่างกันอย่างสิ้นเชิงและการพาณิชย์ - มันมีความสัมพันธ์กับโมดูล Apache ไม่มันเป็นคำถามที่แตกต่างอย่างสิ้นเชิงและฉันไม่เคยมีประสบการณ์การใช้มัน
kba

เป็นเรื่องจริงดังนั้นจึงไม่มีสคริปต์ทั่วไปใช่ไหม
ความสัมพันธ์

@DrCord แล้วฉันเดาว่าคุณจะใช้มันใน CGI
kba

ไม่ได้ใช้มันในสคริปต์ PHP เช่นเดียวกับคำตอบและคำตอบด้านล่าง if (! function_exists ('apache_get_modules')) {phpinfo (); ตาย; } เสมอเป็นจริงบนเซิร์ฟเวอร์ของฉัน ...
DrCord

2
@Gerep phpinfo()มีประโยชน์สำหรับหลาย ๆ อย่าง แต่ถ้าคุณต้องการเขียนระบบที่ใช้mod_rewriteถ้ามันถูกเปิดใช้งานหรือมิฉะนั้นกลับไปสู่พฤติกรรมอื่น ๆ มันจะมีประโยชน์ในการตรวจสอบโดยทางโปรแกรม
kba

94

คัดลอกโค้ดนี้แล้วเรียกใช้เพื่อค้นหา


<?php
 if(!function_exists('apache_get_modules') ){ phpinfo(); exit; }
 $res = 'Module Unavailable';
 if(in_array('mod_rewrite',apache_get_modules())) 
 $res = 'Module Available';
?>
<html>
<head>
<title>A mod_rewrite availability check !</title></head>
<body>
<p><?php echo apache_get_version(),"</p><p>mod_rewrite $res"; ?></p>
</body>
</html>

phpinfo จะบอกฉันด้วยหรือไม่ถ้าฉันไม่ได้เปิดใช้งาน mod_php
Owen McAlack

2
ใช่เราเห็นได้ใน phpinfo.php "โมดูลโหลด" ทั้งหมดของ Apche
Mohini

52

ฉันชอบทางออกของ Christian Roy :

###  .htaccess

<IfModule mod_rewrite.c>

    # Tell PHP that the mod_rewrite module is ENABLED.
    SetEnv HTTP_MOD_REWRITE On

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # The rest of your rewrite rules here

</IfModule>

จากนั้นคุณสามารถตรวจสอบรหัส PHP ของคุณ

    array_key_exists('HTTP_MOD_REWRITE', $_SERVER);

ไม่ทราบว่าจะใช้กับ IIS ได้หรือไม่ (ฉันไม่มีวิธีตรวจสอบ) แต่ราคาก็ดี


4
ด้วย<IfModule mod_env.c>มันจะสมบูรณ์แบบเกือบ :)
RibeiroBreno

นี่เป็นวิธีแก้ปัญหาที่ง่ายและมีประโยชน์มากและใช้งานได้แม้ว่า PHP จะทำงานเป็น CGI
Jose B

ตามที่ @RibeiroBreno พูดถึงด้วย <IfModule mod_env.c> มันจะเกือบสมบูรณ์แบบ สิ่งนี้ใช้ได้สำหรับฉันอย่างสมบูรณ์แบบ
Kassem

ถ้า PHP ทำงานเป็น CGI นี่เป็นวิธีที่จะไป ทำงานได้อย่างสวยงาม
Wojciech Jakubas

35

อัปโหลดไฟล์ชื่อ info.php ด้วยรหัสนี้และเรียกใช้:

<?php 
phpinfo();

ค้นหา mod_rewrite บนหน้าและดูว่าคุณสามารถหามันได้ภายใต้โหลดโมดูล


28

อย่าทำให้มันยากจนคุณสามารถค้นพบสิ่งต่อไปนี้ phpinfo();

ป้อนคำอธิบายรูปภาพที่นี่

หวังว่าจะเป็นประโยชน์!

ขอบคุณ


นี่เป็นเส้นทางที่เร็วและง่ายที่สุดสำหรับฉันเนื่องจากฉันทำสิ่งต่าง ๆ ด้วยการโทร / ไฟล์ phpinfo ขอบคุณ! :)
Brian U

@loyola ฉันไม่สามารถอัปเดตความคิดเห็นของฉันได้ดังนั้นฉันจึงลบขอบคุณ
vanduc1102

11

ผ่านทางบรรทัดคำสั่งที่เรามีอยู่ใน centOs ที่เราสามารถทำได้

httpd -l

1
และถ้าคุณอยู่บน Ubuntu: apache2 -l
คุณและ

2
หรือapachectl -Mใน Ubuntu เช่นกัน
Batandwa

ดูเหมือนว่าจะแสดงเฉพาะโมดูลที่คอมไพล์แล้ว
jayarjo

2
httpd -Mแสดงรายการของโมดูลแบบคงที่และแบบแบ่งใช้ที่โหลดแล้ว
jayarjo

7
<?php
phpinfo();
?>

ดูภายใต้ Configuration ใน apache2handler ในแถว Loaded Modules

มันง่ายและใช้งานได้

<?php foreach( apache_get_modules() as $module ) echo "$module<br />";  ?>

7

นี่เป็นวิธีปัจจุบันของฉันในการตรวจสอบว่า Mod_rewrite เปิดใช้งานสำหรับทั้ง Apache และ IIS

/**
 * --------------------------------------------------------------
 *  MOD REWRITE CHECK
 * --------------------------------------------------------------
 *                                        - By A H Abid
 * Define Constant for MOD REWRITE
 * 
 * Check if server allows MOD REWRITE. Checks for both 
 * Apache and IIS.
 * 
 */
if( function_exists('apache_get_modules') && in_array('mod_rewrite',apache_get_modules()) )
    $mod_rewrite = TRUE;
elseif( isset($_SERVER['IIS_UrlRewriteModule']) )
    $mod_rewrite = TRUE;
else
    $mod_rewrite = FALSE;
define('MOD_REWRITE', $mod_rewrite);

มันทำงานในเครื่องท้องถิ่นของฉันและทำงานบนเว็บโฮสต์ IIS ของฉัน อย่างไรก็ตามบนเซิร์ฟเวอร์ apache นั้นไม่ทำงานสำหรับ Apache เนื่องจาก apache_get_modules () ถูกปิดใช้งาน แต่ mod_rewrite ถูกเปิดใช้งานในเซิร์ฟเวอร์นั้น


3

คุณสามารถรับรายการโมดูล apache ที่ติดตั้งและตรวจสอบได้ บางทีคุณสามารถตรวจสอบว่ามีการติดตั้งหรือไม่โดยค้นหาไฟล์. dll (หรือเทียบเท่า linux)


@kba วิธีตรวจสอบในโหมด CGI
ravisoni


1

exec()วิธีการหนึ่งที่มากขึ้นผ่าน

exec('/usr/bin/httpd -M | find "rewrite_module"',$output);

หากmod_rewriteถูกโหลดมันจะส่งคืน "rewrite_module" ในเอาต์พุต


0

อีกแนวคิดหนึ่งที่เป็นแฮ็คที่สกปรกมากขึ้นเกี่ยวกับ mod rewrite คือเซิร์ฟเวอร์ไม่จำเป็นต้องมีปัญหา php: ทำไมไม่ถ้าคุณมีความเป็นไปได้ให้สร้างไดเรกทอรีทดสอบใส่. htaccess ไว้ในนั้นเขียนใหม่เพื่อ test.php โทรหาไดเรกทอรี ผ่านทาง http และตรวจสอบว่าคุณได้รับผลลัพธ์ตามที่คุณคาดหวังไว้ใน test.php หรือไม่

แน่นอนสกปรก



0

วิธีการเกี่ยวกับการเปลี่ยนเส้นทางไปยังไฟล์ที่รู้จักแล้วตรวจสอบว่าการเปลี่ยนเส้นทางนั้นใช้งานได้จริงกับ curl หรือไม่


0

สำหรับ IIS heros และ heroins:

ไม่จำเป็นต้องค้นหา mod_rewrite เพียงติดตั้งโมดูลRewrite 2แล้วนำเข้าไฟล์. htaccess

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.