วิธีตรวจสอบว่าเปิดใช้งาน mod_rewrite บนเซิร์ฟเวอร์หรือไม่


105

ฉันกำลังใช้โฮสติ้งที่มีLightspeedเซิร์ฟเวอร์ โฮสติ้งแจ้งว่าmod_rewriteเปิดใช้งานแล้ว แต่ฉันไม่สามารถใช้งานสคริปต์ได้ที่นั่น เมื่อใดก็ตามที่ฉันพยายามเข้าถึง URL มันจะส่งกลับ404 - not found page

ฉันใส่รหัสเดียวกันที่เซิร์ฟเวอร์อื่นซึ่งทำงานกับ Apache มันทำงานตรงนั้น ดังนั้นฉันเดาว่ามันเป็นปัญหา.htaccessและmod_rewrite

แต่ฝ่ายสนับสนุนโฮสติ้งยังคงยืนยันกับฉันว่า mod_rewrite ของพวกเขาเปิดอยู่ดังนั้นฉันจึงอยากทราบว่าจะตรวจสอบได้อย่างไรว่าเปิดใช้งานจริงหรือไม่

ผมลองเช็คดูphpinfo()แล้วแต่โชคไม่เจอที่mod_rewriteนั่นเป็นเพราะใช้งานอยู่lightspeedหรือเปล่า?

มีวิธีใดในการตรวจสอบ? กรุณาช่วยฉันออกไป. ขอบคุณ.

FYI:.htaccessรหัสของฉันคือ

Options -Indexes

<IfModule mod_rewrite.c>
DirectoryIndex index.php
RewriteEngine on

RewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
</IfModule>

ฉันพยายามเช่นนี้ด้วย

DirectoryIndex index.php
RewriteEngine on

RewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

แต่ผลลัพธ์เดียวกัน

คำตอบ:


100

จากบรรทัดคำสั่งพิมพ์

sudo a2enmod เขียนใหม่

หากเปิดใช้งานโหมดเขียนซ้ำอยู่แล้วระบบจะแจ้งให้คุณทราบ!


นี่เป็นวิธีที่ง่ายที่สุดในการเปิดใช้งาน mod rewrite
andromeda

3
ใช่! สมบูรณ์แบบสมบูรณ์แบบ
George Dimitriadis

ทำงานแล้ว ง่ายและสะดวก ขอบคุณ
biplab Rout

98
  1. หากต้องการตรวจสอบว่าโมดูล mod_rewrite เปิดใช้งานอยู่หรือไม่ให้สร้างไฟล์ php ใหม่ในโฟลเดอร์รากของเซิร์ฟเวอร์ WAMP ของคุณ ป้อนต่อไปนี้

    phpinfo();

  2. เข้าถึงไฟล์ที่คุณสร้างขึ้นจากเบราว์เซอร์ของคุณ

  3. CtrlFเพื่อเปิดการค้นหา ค้นหา 'mod_rewrite' หากเปิดใช้งานคุณจะเห็นเป็น 'โมดูลโหลด'

  4. ถ้าไม่มีให้เปิด httpd.conf (ไฟล์ Apache Config) และมองหาบรรทัดต่อไปนี้

    #LoadModule rewrite_module modules/mod_rewrite.so

  5. ลบเครื่องหมาย pound ('#') ที่จุดเริ่มต้นและบันทึกไฟล์นี้

  6. รีสตาร์ทเซิร์ฟเวอร์ apache ของคุณ

  7. เข้าถึงไฟล์ php เดียวกันในเบราว์เซอร์ของคุณ

  8. ค้นหา 'mod_rewrite' อีกครั้ง คุณควรจะสามารถค้นหาได้แล้ว


9
ฉันเชื่อว่า phpinfo () รายงานApache Loaded Modules เมื่อ PHP ถูกเรียกใช้เป็นโมดูล Apache OP ระบุว่า PHP ทำงานบน Lightspeed ซึ่งมีเอ็นจิ้นการเขียนซ้ำที่เข้ากันได้กับ mod_rewrite ของตัวเอง
MrWhite

2
สำหรับขั้นตอนแรกฉันต้องป้อน: <? php echo phpinfo (); ?>
Greg Noe

7
โปรดทราบว่าวิธีนี้จะใช้ไม่ได้หากคุณใช้ PHP เป็นแอปพลิเคชัน CGI (ซึ่งในกรณีนี้หากช่องphpinfo()"Server API" แสดง "CGI / FastCGI") phpinfo()จะไม่แสดงรายการโมดูลที่เปิดใช้งาน ในกรณีที่เห็นวิธีการตรวจสอบสำหรับ mod_rewrite ใน PHP CGI
Rory O'Kane

69

หากคุณกำลังใช้ไฟล์คอนฟิกูเรชันโฮสต์เสมือนตรวจสอบให้แน่ใจว่าโฮสต์เสมือนที่เป็นปัญหามีคำสั่งAllowOverride Allเช่นนี้:

<VirtualHost *:80>
        ...
    <Directory "directory/of/your/.htaccess">
        AllowOverride All
    </Directory>
</VirtualHost>

โดยทั่วไปสถานะนี้อนุญาตให้ประมวลผลคำสั่ง. htaccess ทั้งหมด


3
ขอบคุณ. ฉันเป็นหนี้คุณบัดไวเซอร์ <3
Nishant Ghodke

หมายถึงอะไร...ใน<Directory ...>? ฉันจะใส่อะไรที่นั่น? ไดเรกทอรีที่. htaccess คืออะไร?
João Pimentel Ferreira

ใช่แน่นอน ... ควรพูดถึงระหว่างเครื่องหมายคำพูด "... " ไดเรกทอรีที่. htaccess คือ
João Pimentel Ferreira

มันมี. ฉันคัดลอกไฟล์ conf จากเซิร์ฟเวอร์และในขณะที่ฉันเปลี่ยนServerNameฉันไม่ได้เปลี่ยนชื่อไดเร็กทอรีหลังจากนั้นและ apache เริ่มต้นใหม่ก็ใช้ได้
D. Dan

2
Richard หากคำตอบนี้ได้ผลสำหรับคุณและแก้ไขปัญหาของคุณได้คุณควรทำเครื่องหมายว่าถูกต้องและให้รางวัล @Jahmic เนื่องจากเขาครบกำหนด
Sinthia V

18

หากไม่รู้จัก apache_get_modules () หรือไม่มีข้อมูลเกี่ยวกับโมดูลนี้ใน phpinfo (); ลองทดสอบ mod rewrite โดยเพิ่มบรรทัดเหล่านั้นในไฟล์. htaccess ของคุณ:

RewriteEngine On
RewriteRule ^.*$ mod_rewrite.php

และ mod_rewrite.php:

<?php echo "Mod_rewrite is activated!"; ?>

15

คอนโซล:

<VirtualHost *:80>
        ...
    <Directory ...>
        AllowOverride All
    </Directory>
</VirtualHost>

sudo a2enmod rewrite
sudo service apache2 restart

ฉันพยายามอย่างมากเพื่อแก้ปัญหานี้แล้วเมื่อลองสิ่งนี้ก็ใช้ได้กับฉัน ตอนนี้ฉันมี apache และ ubuntu ตัวสุดท้ายแล้ว
Fernando Sanchiz

15

ถ้า

in_array('mod_rewrite', apache_get_modules())

ส่งคืนtrueจากนั้นเปิดใช้งาน mod-rewrite


โซลูชันบรรทัดเดียวที่สมบูรณ์แบบเพื่อตรวจสอบโมดูลการเขียนซ้ำที่เปิดใช้งานหรือไม่ผ่านรหัส PHP
Shakeel Ahmed

12

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

<?php
print_r(apache_get_modules());
?>

หากตัวอย่างข้างต้นล้มเหลวคุณสามารถตรวจสอบการเขียน.htaccessซ้ำโดยใช้ไฟล์ของคุณ

สร้างhtaccessไฟล์ในรูทเอกสารและเพิ่ม rewriteRule ต่อไปนี้:

RewriteEngine on

RewriteRule ^helloWorld/?$ /index.php [NC,L]

ตอนนี้ไปที่http://example.com/HelloWorldคุณจะถูกส่งต่อไปยังหน้า/index.phpของไซต์ของคุณ มิฉะนั้นหากปิดใช้งาน mod-rewrite คุณจะได้รับข้อผิดพลาด 500 Internel server

หวังว่านี่จะช่วยได้


ฉันใช้ 7.2, apache_get_modules ไม่ได้กำหนด ฉันต้องรีสตาร์ท apache2 หลังจากแก้ไข.htaccessหรือไม่
Adi Prasetyo

1
ไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์เมื่อใช้ htaccess
Amit Verma

12

คุณสามารถทำได้บนเทอร์มินัลอย่างใดอย่างหนึ่ง:

apachectl -M
apache2ctl -M

นำมาจาก2daygeek


ใน Debian 9 มันใช้งานได้ แต่คุณต้องเข้าสู่ระบบในฐานะรูทหรือใช้sudo
androsfat

11

สิ่งนี้ใช้ได้กับ CentOS:

$ sudo httpd -M |grep rewrite_module

ควรส่งออก rewrite_module (shared)


นี่เป็นวิธีที่ดีที่สุดในการทำบน CentOS โดยสมมติว่าคุณมีสิทธิ์เข้าถึง ssh ขอบคุณ @radtek!
John T.

10

หากรหัสนี้อยู่ในไฟล์. htaccess ของคุณ (โดยไม่ต้องตรวจสอบ mod_rewrite.c)

DirectoryIndex index.php
RewriteEngine on

RewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

และคุณสามารถเยี่ยมชมหน้าใดก็ได้ในไซต์ของคุณเมื่อได้รับข้อผิดพลาด 500 เซิร์ฟเวอร์ฉันคิดว่าปลอดภัยที่จะแจ้งว่าเปิดการเขียนซ้ำ mod แล้ว


3
คุณจึงสามารถเข้าถึงบางหน้าบนไซต์ได้โดยไม่มีข้อผิดพลาด 500? โดยทั่วไปหมายความว่าหากไฟล์. htaccess ถูกอ่านว่าต้องเปิด mod_rewrite อย่างไรก็ตามอาจไม่สามารถอ่าน. htaccess ได้ ... ลองเขียนอักขระไร้สาระที่ด้านบนของไฟล์. htaccess ของคุณซึ่งจะทำให้การเชื่อมต่อขาดหายไปพร้อมกับข้อผิดพลาดของเซิร์ฟเวอร์ 500 หาก Apache กำลังอ่านไฟล์จริงๆ หากกำลังอ่านอยู่คุณสามารถยกตัวอย่าง URL ที่คิดว่าน่าจะใช้ได้หรือไม่
Clive

ปัญหาคือมันไม่ใช่เซิร์ฟเวอร์ apache มันเป็นไลท์สปีด ฉันไม่เคยได้รับข้อผิดพลาด 500 ทั้งหมดที่ฉันได้รับคือข้อผิดพลาด 404 นั่นเป็นเหตุผลที่ฉันสงสัยว่า. htaccess ไม่ได้เปิดใช้งาน
knightrider

น่าจะใช่ฉันลองใส่อักขระไร้สาระใน. htaccess และดูว่าคุณได้รับข้อผิดพลาด 500 หรือไม่เมื่อคุณไปที่หน้าที่ไม่ได้เขียนซ้ำโดยตรง (เช่น index.php) ถ้าไม่เป็นเช่นนั้นคุณควรโพสต์คำถามใหม่เพื่อถามวิธีเปิดใช้งาน. htaccess ด้วย Lightspeed
Clive

5

คุณสามารถใช้ฟังก์ชัน php

      apache_get_modules

และตรวจสอบ mod_rewrite

<pre>
<?php
print_r(apache_get_modules());
?>
</pre>

http://in2.php.net/apache_get_modules


2
apache_get_modules () จะใช้ได้ก็ต่อเมื่อ PHP ทำงานเป็นโมดูล Apache OP ระบุว่า PHP ทำงานบน Lightspeed
MrWhite

5

หากคุณอยู่ในระบบ linux คุณสามารถตรวจสอบโมดูลเปิดใช้งานทั้งหมดสำหรับ apache2 (ในกรณีของฉัน) ในโฟลเดอร์ต่อไปนี้: / etc / apache2 / mods-available

cd /etc/apache2/mods-available

ที่จะพิมพ์: ll -a
หากคุณต้องการตรวจสอบโมดูลที่มีสำหรับ php (ในกรณีนี้คือ php 7) โฟลเดอร์ /etc/php/7.0/mods-available

cd /etc/php/7.0/mods-available

พิมพ์: ll -a


4

เพียงแค่สร้างหน้าใหม่และเพิ่มรหัสนี้

 <?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>

และเรียกใช้หน้านี้จากนั้นจะพบว่าโมดูลสามารถใช้งานได้หรือไม่หากไม่เป็นเช่นนั้นคุณสามารถขอให้โฮสติ้งของคุณหรือหากคุณต้องการเปิดใช้งานในเครื่องท้องถิ่นจากนั้นตรวจสอบการสอนทีละขั้นตอนของ youtube ที่เกี่ยวข้องกับการเปิดใช้งานโมดูลการเขียนซ้ำใน wamp apache https://youtu.be/xIspOX9FuVU?t=1m43s ไอคอนเซิร์ฟเวอร์ Wamp -> Apache -> โมดูล Apache และตรวจสอบตัวเลือกโมดูลการเขียนซ้ำ


2

ฉันรู้ว่าคำถามนี้เป็นรุ่นเก่า แต่ถ้าคุณสามารถแก้ไขไฟล์การกำหนดค่า Apache ของคุณเพื่อAllowOverride AllจากAllowOverride None

<Directory "${SRVROOT}/htdocs">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   AllowOverride FileInfo AuthConfig Limit
    #
    AllowOverride All

    #
    # Controls who can get stuff from this server.
    #
    Require all granted
</Directory>

เป็นความคิดที่ดีที่จะบอกชื่อที่แน่นอนและเมื่อเป็นไปได้ตำแหน่งของไฟล์ที่จำเป็นต้องเปลี่ยน จะเป็นประโยชน์สำหรับผู้มาใหม่ ขอบคุณ
MindRoasterMir

นอกจากนี้ควรจำไว้ว่าการเปลี่ยนแปลงจะมีผลหลังจากที่คุณปรับ apache ใหม่แล้วเท่านั้น ขอบคุณ
MindRoasterMir

1

คุณต้องตรวจสอบว่ามีไฟล์อยู่หรือไม่โดยพิมพ์

cat /etc/apache2/mods-available/rewrite.load

บรรทัดผลลัพธ์อาจไม่ถูกแสดงความคิดเห็นโดยเริ่มต้นด้วย #


1

รหัสนี้ใช้ได้กับฉัน:

if (strpos(shell_exec('/usr/local/apache/bin/apachectl -l'), 'mod_rewrite') !== false) echo "mod_rewrite enabled";
else echo "mod_rewrite disabled";

0

ฉันมีปัญหาแน่นอนฉันแก้ไขได้โดยคลิกโครงสร้างที่กำหนดเองจากนั้นเพิ่ม/index.php/%postname%/และใช้งานได้

หวังว่านี่จะช่วยให้ใครบางคนไม่ต้องเครียดกับการค้นหาสิ่งที่ผิดพลาดกับมัน

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