. htaccess ไม่ทำงาน apache


135

ฉันมีเซิร์ฟเวอร์จากบริการ AWS EC2 ที่ใช้งานบน Linux ubuntu และฉันได้ติดตั้ง apache, php และ mysql

ฉันเพิ่ม.htaccessไฟล์ในเอกสารรูท/var/www/htmlแล้ว

ฉันป้อนรหัสนี้: ErrorDocument 404 /var/www/html/404.phpและมันยังไม่ปรากฏขึ้น

ฉันป้อนคำสั่งนี้หลายครั้ง: sudo service httpd restartเพื่อรีสตาร์ทเซิร์ฟเวอร์ แต่ไม่มีการเปลี่ยนแปลงที่แสดง ...

ฉันจะแก้ไขสิ่งนี้ได้อย่างไร ... ฉันทำอะไรผิดหรือเปล่า?

ขอบคุณล่วงหน้า!


2
คุณแน่ใจว่าคุณต้องการที่จะแม400 Bad Requestข้อผิดพลาด/var/www/html/404.php?
จอนหลิน

คำตอบ:


288

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

ประการที่สองหากไฟล์. htaccess ถูกเพิกเฉยคุณต้องตรวจสอบเพื่อดูว่า AllowOverride ตั้งค่าไว้ถูกต้อง ดูhttp://httpd.apache.org/docs/2.4/mod/core.html#allowoverrideสำหรับรายละเอียด คุณต้องตรวจสอบให้แน่ใจว่าได้ตั้งค่าไว้ในขอบเขตที่ถูกต้องเช่นในบล็อกด้านขวาในการกำหนดค่าของคุณ ตรวจสอบให้แน่ใจว่าคุณไม่ได้แก้ไขบล็อกในบล็อก

ประการที่สามถ้าคุณต้องการให้แน่ใจว่าไฟล์. htaccess นั้นกำลังอ่านอยู่ให้ใส่ขยะในนั้น บรรทัดที่ไม่ถูกต้องเช่น "INVALID LINE HERE" ในไฟล์. htaccess ของคุณจะทำให้เกิดข้อผิดพลาดเซิร์ฟเวอร์ 500 เมื่อคุณชี้เบราว์เซอร์ของคุณไปที่ไดเรกทอรีที่มีไฟล์นั้น หากไม่เป็นเช่นนั้นคุณจะไม่ได้กำหนดค่า AllowOverride อย่างถูกต้อง


141
+1 สำหรับวางขยะในไฟล์. htaccess เป็นเครื่องมือวิเคราะห์
retrohacker

46
ขยะในการเขียนโปรแกรมมีประโยชน์มากกว่าที่คิด
EnKrypt

1
ฉัน putted "A STRING" ใน. htaccess ของฉันดังนั้นฉันได้รับข้อผิดพลาดดังนั้นฉัน putted AllowOverride Allในapache2.confDebian ของฉันและใช้งานได้
Alex

1
โปรดทราบว่าAllowOverrideใช้งานได้เฉพาะใน<Directory>คำสั่งและจะถูกละเว้นหากอยู่ใน<Location ...>ส่วนโปรดดู: httpd.apache.org/docs/2.4/mod/core.html#allowoverride
Daniel Sokolowski

2
นอกจากนี้โปรดทราบว่า<Directory>คำสั่งคาดว่าจะเป็นเส้นทางที่สมบูรณ์แทนการเป็นญาติ ในกรณีของฉัน<Directory /> ล้มเหลวขณะ<Directory /var/www/html/subdir>ทำงาน
Lukas Knuth

115
  1. เปิดใช้งานโมดูล Apache mod_rewrite

    a2enmod rewrite

  2. เพิ่มรหัสต่อไปนี้เพื่อ /etc/apache2/sites-available/default

    AllowOverride All

  3. รีสตาร์ท apache

    /etc/init.d/apache2 restart


7
โปรดทราบว่าใน Apache 2.4 ไฟล์การกำหนดค่าภายใต้ / etc / apache2 / sites-available จะต้องลงท้ายด้วย. config ทันที และฉันมีการผสมผสานบางอย่างบนเซิร์ฟเวอร์ของฉันด้วย default.conf ใน / etc / apache2 / sites-available และอีกหนึ่งใน / etc / apache2 /
rubo77

2
ขอบคุณในกรณีของฉันการเขียนใหม่ไม่ได้เปิดใช้งานโดยค่าเริ่มต้นใน apache2
ข้าม

ฉันได้ทำตามขั้นตอนนี้แล้ว แต่มันไม่ทำงานใน apache 2.4 สิ่งที่ฉันทำผิด = [
Luciano Andress Martini

ดูเหมือนว่าต้องมีการแทนที่ ip ต้องการการรับรองความถูกต้องพฤติกรรมนี้ไม่คาดคิด (อนุญาตจาก ip ที่แน่นอนใน apache 2.2 อย่าทำอย่างนี้) และในความคิดของฉันอาจเป็นอันตรายได้มาก !
Luciano Andress Martini

ฉันข้ามขั้นตอนแรกไปแล้ว แต่เปลี่ยน AllowOverride เป็น All ใน apache.conf ของฉัน (Debian 8, /etc/apache2/apache.conf) รีสตาร์ทและไม่สามารถเข้าถึงไฟล์ได้ดี แต่ข้อผิดพลาดไม่เหมือนการปฏิเสธสิทธิ์ แต่ 500 Internal Server Error ทำไมถึงเป็นเช่นนั้น ฉันจะแก้ไขได้ไหม
dasLort

44

หากคุณลองทั้งหมดข้างต้นซึ่งเป็นคำตอบที่ถูกต้องและดีทั้งหมดและไฟล์ htaccess ของคุณไม่ทำงานหรืออ่านการเปลี่ยนแปลงคำสั่งในapache2.confไฟล์ ภายใต้ Ubuntu เส้นทางคือ/etc/apache2/apache2.conf

เปลี่ยน<Directory>คำสั่งชี้ไปที่หน้าเว็บสาธารณะของคุณซึ่งมีไฟล์ htaccess อยู่ เปลี่ยนจากAllowOverride Noneเป็นAllowOverride All

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

ฉันมีปัญหาเดียวกันและพบคำตอบและคำอธิบายบน Ubuntu ถาม! ฟอรัม/ubuntu/421233/enabling-htaccess-file-to-rewrite-path-not-working


2
หรือสามารถเพิ่มได้ใน VHost
ssi-anik

ที่จริงแล้วAllowOverride FileInfoจำเป็นต้องมีในบรรทัดที่ 3 เพื่อ.htaccessให้สามารถอ่านและใช้ไฟล์ได้ Allยังเปิดใช้งานการแทนที่การกำหนดค่าเพิ่มเติมเช่น.httpasswd(ซึ่งสามารถเปิดใช้งานทีละรายการโดยใช้AuthconfigแทนAll)
Rafal

20

สำหรับUbuntu
ก่อนอื่นให้รันคำสั่งนี้: -

sudo a2enmod rewrite

จากนั้นแก้ไขไฟล์/etc/apache2/sites-available/000-default.confโดยใช้ nano หรือ vim โดยใช้คำสั่งนี้: -

sudo nano /etc/apache2/sites-available/000-default.conf

จากนั้นในไฟล์เพิ่มนี้หลังจากบรรทัด000-default.conf DocumentRoot /var/www/htmlหากไดเรกทอรี html root ของคุณเป็นสิ่งอื่นให้เขียนดังนี้: -

<Directory "/var/www/html">
  AllowOverride All
</Directory>

หลังจากทำทุกอย่างรีสตาร์ท apache โดยใช้คำสั่ง sudo service apache2 restart


6

เพียงทำตาม 3 ขั้นตอน

  1. เปิดใช้งาน mode_rewrite โดยใช้คำสั่งต่อไปนี้

    sudo a2enmod เขียนใหม่

รหัสผ่านจะถูกถาม ดังนั้นใส่รหัสผ่านของคุณ

  1. อัปเดตไฟล์000-default.confหรือdefault.conf ของคุณอยู่ที่/ etc / apache2 / sites-available / directory คุณไม่สามารถแก้ไขได้โดยตรง ดังนั้นใช้คำสั่งต่อไปนี้เพื่อเปิด

    sudo gedit /etc/apache2/sites-available/000-default.conf

หรือ sudo gedit /etc/apache2/sites-available/default.conf

คุณจะได้รับ

DocumentRoot / var / www / html

หรือ

DocumentRoot / var / www

ไลน์. เพิ่มรหัสต่อไปนี้หลังจากนั้น

<Directory /var/www/html/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

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

  1. รีสตาร์ทเซิร์ฟเวอร์ apache ของคุณโดยใช้คำสั่งต่อไปนี้

    sudo service apache2 เริ่มต้นใหม่


ขอบคุณ ทักทายจากบราซิล.
Fox.11

5

อาจเป็นไปได้ว่า AllowOverride ถูกตั้งค่าเป็น None ในส่วน Directory ของ apache2.conf อยู่ในโฟลเดอร์ / etc / apache2

ลองตั้งค่าเป็น AllowOverride All


5

จากประสบการณ์ของฉันไดเร็กตอรี่ / var / www / directory ป้องกันไดเรกตอรีโฮสต์เสมือนของโฟลเดอร์ย่อย ดังนั้นหากคุณลองใช้คำแนะนำทั้งหมดและยังไม่ทำงานและคุณใช้ virtualhosts ลองทำเช่นนี้

1 - ตรวจสอบให้แน่ใจว่าคุณมี AllowOverride Allคำสั่ง /etc/apache2/sites-available/example.com.conf

2 - ตรวจสอบ / var / www / ไดเรกทอรีคำสั่งใน/etc/apache2/apache2.conf(อาจเป็นที่บรรทัดที่ 164) ซึ่งดูเหมือน;

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

หากมีการAllowOverride Noneเปลี่ยนแปลงคำสั่งเป็น AllowOverride All หรือเพียงแค่หลบหนีสาย


3

โดยค่าเริ่มต้น Apache ห้ามใช้ไฟล์. htaccess เพื่อใช้กฎการเขียนซ้ำดังนั้น

ขั้นตอนที่ 1 - การเปิดใช้งาน mod_rewrite (ถ้าไม่เปิดใช้งาน) อันดับแรกเราต้องเปิดใช้งาน mod_rewrite พร้อมใช้งาน แต่ไม่เปิดใช้งานด้วยการติดตั้ง Apache 2 แบบใหม่ทั้งหมด

$ sudo a2enmod rewrite

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

$ sudo systemctl restart apache2

mod_rewrite เปิดใช้งานอย่างสมบูรณ์แล้ว ในขั้นตอนถัดไปเราจะตั้งค่าไฟล์. htaccess ที่เราจะใช้เพื่อกำหนดกฎการเขียนซ้ำสำหรับการเปลี่ยนเส้นทาง

ขั้นตอนที่ 2 - การตั้งค่า. htaccess เปิดไฟล์การกำหนดค่า Apache เริ่มต้นโดยใช้นาโนหรือโปรแกรมแก้ไขข้อความที่คุณชื่นชอบ

$ sudo nano /etc/apache2/sites-available/000-default.conf

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

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    <Directory /var/www/html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    . . . 
</VirtualHost>

บันทึกและปิดไฟล์ หากต้องการให้การเปลี่ยนแปลงเหล่านี้มีผลบังคับใช้ให้รีสตาร์ท Apache

$ sudo systemctl restart apache2

เสร็จสิ้น . htacess ของคุณควรใช้งานได้ ลิงค์นี้อาจช่วยใครซักคนได้ https://www.digitalocean.com/community/tutorials/how-to-rewrite-urls-with-mod_rewrite-for-apache-on-ubuntu-16-04


คำสั่งรีสตาร์ทที่ใช้งานได้สำหรับฉันคือ$ sudo httpd -k restart(Red Hat 4.4.7-23)
Himalaya Garg




0

เพื่อความสมบูรณ์ถ้า "AllowOverride All" ไม่สามารถแก้ปัญหาของคุณได้คุณสามารถแก้ไขปัญหานี้ได้โดยใช้:

  1. เรียกใช้apachectl -Sและดูว่าคุณมี namevhost มากกว่าหนึ่งรายการหรือไม่ อาจเป็นเพราะ httpd กำลังค้นหา. htaccess ของ DocumentRoot อื่น

  2. ใช้strace -f apachectl -Xและค้นหาตำแหน่งที่โหลด (หรือไม่โหลด). htaccess จาก

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