วิธีเปิดใช้งาน mod_rewrite สำหรับ Apache 2.2


474

ฉันได้ติดตั้ง Apache 2.2 ใหม่บนเครื่อง Vista ของฉันทุกอย่างทำงานได้ดียกเว้น mod rewrite

ฉันไม่แสดงความคิดเห็น

LoadModule rewrite_module modules/mod_rewrite.s

แต่ไม่มีกฎการเขียนซ้ำของฉันอีกเลยแม้แต่กฎง่ายๆ

RewriteRule not_found %{DOCUMENT_ROOT}/index.php?page=404

กฎทั้งหมดที่ฉันใช้กำลังทำงานกับโฮสติ้งของฉันดังนั้นพวกเขาควรจะโอเคดังนั้นคำถามของฉันคือมีสิ่งใดที่ซ่อนอยู่ในการกำหนดค่า apache ที่สามารถบล็อกการเขียนใหม่ mod หรือไม่


1
ที่จริงปัญหาคือว่าฉันมีเส้นทางที่ไม่ถูกต้องเนื่องจาก $ {DOCUMENT_ROOT} ชี้ให้ฉันไปที่ไดเรกทอรีรากซึ่งก็โอเคในการโฮสต์ แต่ผิดเกี่ยวกับท้องถิ่นดังนั้นปัญหาไม่ได้เป็นเพียงแค่ RewriteEngine On ซึ่งฉันมีอยู่แล้ว ..
Jakub Arnold

คุณกรุณาเปลี่ยนคำตอบที่ยอมรับให้เป็นคำตอบนี้ได้ไหม ผู้เขียนคำตอบที่ยอมรับในปัจจุบันยอมรับว่ามันไม่ดีพอ
Shadow Wizard คือหูสำหรับคุณ

1
วิธีการเปิดใช้ mod_rewrite ใน Ubuntu 12.04 LTS (ควรจะทำงานใน Debian เกินไป) สิ่งนี้แสดงให้เห็นถึงการติดตั้งและการเปิดใช้งานบทเรียนด้านล่างไม่น่าแปลกใจเลย :(
Sliq

3
ฉันขอแนะนำอย่างยิ่งให้ทุกคนที่ต้องการเปิดใช้งานคำสั่ง mod_rewrite ในไฟล์. htacces ให้ใช้AllowOverride FileInfoแทนการอนุญาตทุกอย่างตามคำตอบทั้งหมดในหน้านี้ที่แนะนำ น่าเศร้าที่เห็นคำตอบทั้งหมดเหล่านี้ใช้เวลานานเท่าที่จะทำงานมันไม่เป็นไรเข้าใกล้แทนที่จะพยายามทำความเข้าใจผลที่ตามมาของ 'วิธีแก้ปัญหา' ที่เสนอ พยายามที่จะเข้าใจสิ่งที่คุณทำบนเซิร์ฟเวอร์ของคุณและวิธีการ จำกัด AllowOverride Allสิทธิ์ของคุณเพียงแค่ให้ไปด้วย RTFM! มันจะออกจากเรื่องที่ชัดเจน
RemyNL

1
@Black อยู่ในไฟล์กำหนดค่า Apache ชื่อ httpd.conf ในพีซีของฉันมันอยู่ในไดเรกทอรี C: \ xampp \ apache \ conf เพราะฉันติดตั้ง Apache ด้วย XAMPP
Lex Soft

คำตอบ:


1005

ในการใช้งานmod_rewriteคุณสามารถพิมพ์คำสั่งต่อไปนี้ในเทอร์มินัล:

sudo a2enmod rewrite

รีสตาร์ท apache2 หลังจาก

sudo /etc/init.d/apache2 restart

หรือ

sudo service apache2 restart

หรือตามวิธีการควบคุมระบบแบบครบวงจรใหม่

sudo systemctl restart apache2

จากนั้นหากคุณต้องการคุณสามารถใช้.htaccessไฟล์ต่อไปนี้

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

.htaccessไฟล์ด้านบน(หากอยู่ในของคุณDocumentRoot) จะเปลี่ยนเส้นทางการรับส่งข้อมูลทั้งหมดไปยังindex.phpไฟล์ในDocumentRootเว้นแต่ไฟล์นั้นมีอยู่

ดังนั้นสมมติว่าคุณมีโครงสร้างไดเรกทอรีต่อไปนี้และ httpdocs คือ DocumentRoot

httpdocs/
    .htaccess
    index.php
    images/
        hello.png
    js/
        jquery.js
    css/
        style.css
includes/
    app/
        app.php

ไฟล์ใด ๆ ที่มีอยู่ใน httpdocs จะเสิร์ฟให้กับผู้ขอใช้.htaccessแสดงข้างต้น httpdocs/index.phpแต่ทุกสิ่งทุกอย่างจะถูกนำไป ไฟล์แอปพลิเคชันของคุณในincludes/appจะไม่สามารถเข้าถึงได้


15
ความคิดที่นี่ถูกต้องสำหรับ UNIX CLI แต่คำสั่งนั้นใช้ได้กับ Linux ที่ใช้ Debian เท่านั้นและไม่ใช่สภาพแวดล้อม Windows ของ OP
Jason Rikard

17
a2enmod เขียนงานได้
Dr Casper Black

98
หมายเหตุเพิ่มเติม: คุณต้องตรวจสอบให้แน่ใจว่าการกำหนดค่าไซต์ของคุณมีAllowOverride Allเพื่อ.htaccessให้สามารถอ่านไฟล์ได้ทั้งหมด
Adam Rosenfield

2
@Dennis คุณสามารถใช้ a2dismod rewrite
Jonathan Mayhak

3
ฉันจะใช้a2enmod rewriteใน windows ได้อย่างไร
Naman

229

สำหรับสถานการณ์ของฉันฉันมี

RewriteEngine On

ในของฉัน.htaccessพร้อมกับโมดูลที่กำลังโหลดและมันไม่ทำงาน

วิธีแก้ไขปัญหาของฉันคือแก้ไขรายการ vhost ของฉันเป็น inlcude

AllowOverride all

ใน<Directory>ส่วนของไซต์ที่เป็นปัญหา


10
อันที่จริงแม้จะมีa2enmod rewriteงานRewriteEngine Onใน.htaccess- การดำรงอยู่ของAllowOverride allในแฟ้ม VirtualHost จะป้องกันไม่ให้มันจากการทำงาน - นี่คือสิ่งที่จับฉันออกเปลี่ยนไปAllowOverride allทำงานเช่นเสน่ห์ :)
HeavenCore

9
เริ่มต้นที่นี่ .. ไฟล์ VirtualHost อยู่ที่ไหน
davneet

3
นี่คือวิธีที่จะไป ... ฉันมีทุกอย่างที่ตั้งค่าไว้ยกเว้นสิ่งนี้
arrayown

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

สิ่งนี้แก้ไขได้สำหรับฉัน - ฉันมีปัญหากับ WordPress ลิงก์ถาวรไม่ทำงานอย่างถูกต้อง ถ้าคุณทำa2enmod rewriteแล้วในไฟล์ VirtualHosts เปลี่ยน 'AllowOverride None' เป็น 'AllowOverride All' มันควรจะทำงาน ไฟล์ VirtualHosts ใช้หากคุณใช้ชื่อโดเมนหลายชื่อกับเซิร์ฟเวอร์เดียวกัน (และที่อยู่ IP) คุณจะตั้งค่าเพื่อตั้งค่าโดเมน
Jason Preston

83

ลองตั้งค่า: AllowOverride All.


ปัญหาที่พบบ่อยที่สุดที่สองคือไม่มีการเปิดใช้งาน mod rewrite a2enmod rewriteแล้วเริ่ม apache ใหม่


นี่ควรเป็นคำตอบที่ # 1 เพราะมันแก้ปัญหาที่เกิดขึ้นในการติดตั้ง Ubuntu เริ่มต้น!
Sliq

1
นี้จะช่วยให้. htaccess แทนที่การตั้งค่า Apache อื่น ๆ ไม่แนะนำ
Bhargav Nanekalva

ใช่ :) นี่เป็นปัญหาของฉันเช่นกัน แต่ที่นี่เป็นสถานที่ที่คุณอธิบายสำหรับมือใหม่เช่นฉันว่า "AllowOverride All" นี้อยู่ใน /etc/apache2/sites-available/ [sitename-ssl] .conf ฉันต้องทำวิจัยครั้งที่สองเพราะคุณ: D ขอบคุณ!
MetaTron

77

หากไม่ใช่งานด้านบนให้ลองแก้ไข / etc / apache2 / sites-enabled / 000-default

เกือบจะอยู่ด้านบนสุดคุณจะพบ

<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

เปลี่ยนAllowOverride NoneไปAllowOverride All

สิ่งนี้ใช้ได้สำหรับฉัน


เปลี่ยนข้อผิดพลาดจาก/laravel/public/authors was not found on this serverเป็น/index.php was not found on this server
Gangaraju

ไม่พบ <ไดเรกทอรี> เพียง <VirtualHost *: 80>
Nicolas S.Xu

1
@ NicolasS.Xu วางสิ่งนี้ไว้ในแท็ก <VirtualHost *: 80>
wimdetr

ฉันได้ทำแบบเดียวกัน แต่ได้เพิ่มหัวข้อใหม่<Directory /var/www/html>เพื่อใช้กฎจากโฟลเดอร์นี้และเพิ่มขึ้นเท่านั้น
Louis Loudog Trottier


28

มีหลายวิธีที่คุณสามารถแก้ไขปัญหานี้ได้หากคุณทราบถึงสาเหตุของปัญหา

ปัญหาที่ 1

ประการแรกอาจเป็นปัญหากับ apache ของคุณที่ไม่มีโมดูล mod_rewrite.c ติดตั้งหรือเปิดใช้งาน

ด้วยเหตุผลนี้คุณจะต้องเปิดใช้งานมันดังนี้

  1. เปิดคอนโซลของคุณและพิมพ์เข้าไปสิ่งนี้:

    sudo a2enmod rewrite

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

    service apache2 restart

ปัญหาที่ 2

  1. นอกจากนี้คุณยังอาจต้องเปลี่ยนกฎการแทนที่จากไฟล์ apache conf (เช่น apache2.conf, http.conf หรือไฟล์ค่าเริ่มต้น 000)

  2. ค้นหา "Directory / var / www /"

  3. เปลี่ยน "แทนที่ไม่มี" เป็น "แทนที่ทั้งหมด"

ปัญหาที่ 3

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

  1. พิมพ์สิ่งนี้ลงในคอนโซล:

    sudo a2enmod userdir

  2. จากนั้นลองเปิดใช้งานโมดูลการเขียนใหม่หากยังไม่ได้เปิดใช้งาน (ดังกล่าวข้างต้น)

หากต้องการอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้คุณสามารถเยี่ยมชมเว็บไซต์นี้: http://seventhsoulmountain.blogspot.com/2014/02/wordpress-permalink-ubuntu-problem-solutions.html


2
รายละเอียดที่ดีของปัญหา
Banago

อย่าใช้AllowOverride Allเพราะจะเปิดใช้งานฟีเจอร์oursoursมากเกินไป (เช่นการใช้สคริปต์ Perl) ใช้แทนAllowOveride Options
Marki555

28

เวอร์ชัน Apache ใหม่มีการเปลี่ยนแปลงในทางใดทางหนึ่ง ถ้ารุ่นอาปาเช่ของคุณคือ 2.4 /etc/apache2/แล้วคุณต้องไป apache2.confจะมีไฟล์ชื่อ คุณต้องแก้ไขสิ่งนั้น (คุณควรได้รับอนุญาตจากรูท) เปลี่ยนข้อความไดเรกทอรีเช่นนี้

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

ตอนนี้รีสตาร์ท apache

service apache2 reload

หวังว่ามันจะใช้งานได้


นี่คือคำตอบล่าสุด
paulc

1
หากคุณอยู่ในปี 2019 หรือมากกว่านั้นโปรดตอบคำตอบนี้ :)
Luiz Cavalcanti

27

เปิดเทอร์มินัลแล้วพิมพ์a2enmod rewriteมันจะเปิดใช้งานของคุณmod_rewriteโมดูลสำหรับ Apache

จากนั้นไปที่ /etc/apache2/sites-availableและแก้ไขไฟล์เริ่มต้น (สำหรับสิ่งนี้คุณต้องมีสิทธิ์ในการเขียนไฟล์นี้และโฟลเดอร์ที่มีในไซต์)

แทนที่ด้านล่างด้วยบรรทัดที่มีอยู่ 4 ถึง 14

DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

ตอนนี้รีสตาร์ท apache ของคุณโดย/etc/init.d/apache2 restartหรือservice apache2 restart

ทำการทดสอบ URL ใหม่อีกครั้งและในครั้งนี้จะถูกส่งผ่าน


15

<แก้ไข>

เพิ่งสังเกตว่าคุณพูด mod_rewrite.s แทน mod_rewrite.so - หวังว่านั่นเป็นคำถามที่พิมพ์ผิดและไม่ได้อยู่ในไฟล์ httpd.conf! :)

</ แก้ไข>

ฉันคุ้นเคยกับการใช้ Apache บน Linux มากขึ้น แต่ฉันต้องทำวันนี้

ก่อนอื่นมาดูในไดเรกทอรีติดตั้ง Apache ของคุณ (ฉันจะสมมติว่าคุณติดตั้งเป็น "C: \ Program Files" ที่นี่)

ดูในโฟลเดอร์: "C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ modules" และตรวจสอบให้แน่ใจว่ามีไฟล์ชื่อ mod_rewrite.so อยู่ในนั้น (ควรมีให้เป็นส่วนหนึ่งของการติดตั้งเริ่มต้น

จากนั้นเปิดซอฟต์แวร์มูลนิธิ \ Apache2.2 \ conf ซอฟต์แวร์ \ Files \ Apache "C: \ Program" และเปิด httpd.conf ตรวจสอบให้แน่ใจสาย:

#LoadModule rewrite_module modules/mod_rewrite.so

ไม่มีคำวิจารณ์:

LoadModule rewrite_module modules/mod_rewrite.so

นอกจากนี้หากคุณต้องการเปิดใช้งาน RewriteEngine เป็นค่าเริ่มต้นคุณอาจต้องการเพิ่มสิ่งที่ต้องการ

<IfModule mod_rewrite>
    RewriteEngine On
</IfModule>

ต่อท้ายไฟล์ httpd.conf ของคุณ

ถ้าไม่แน่ใจว่าคุณระบุ

RewriteEngine On

บางส่วนในไฟล์. htaccess ของคุณ


@gabehabe อวตารของคุณเพิ่งจะดูเหมือนว่ามันถือไอคอนของฉัน doc, lol
Jonathan dos Santos

5

ฉันเพิ่งทำสิ่งนี้

sudo a2enmod rewrite

จากนั้นคุณต้องรีสตาร์ทเซอร์วิส apache โดยทำตามคำสั่ง

sudo service apache2 restart

4

เธรดเก่า, เพียงแค่ต้องการวางที่ไม่ได้ตั้งค่า AllowOverride ให้ทั้งหมดแทนที่จะใช้ mod เฉพาะที่คุณต้องการใช้,

AllowOverride mod_rewrite mod_mime

และบรรทัดนี้ควรยกเลิกความคิดเห็น

LoadModule rewrite_module modules/mod_rewrite.so

refrences


4

ใช้คำสั่งด้านล่าง

sudo a2enmod rewrite

และรีสตาร์ท apache ผ่านคำสั่งด้านล่าง

sudo service apache2 restart

3

เห็นได้ชัดว่ามีมากกว่าหนึ่งวิธีที่จะทำ แต่ฉันขอแนะนำให้ใช้มาตรฐานมากขึ้น:

ErrorDocument 404 /index.php?page=404

3

ครั้งแรกที่ฉันต่อสู้กับกฎ mod_rewrite โดยไม่สนใจปริมาณการใช้งานของฉันฉันได้เรียนรู้ (ผิดเพี้ยน) ว่าฉันใส่ผิด<VirtualHost>ไปซึ่งหมายความว่าปริมาณข้อมูลของฉันจะไม่สนใจพวกเขาทุกคนไม่ว่าพวกเขาจะเขียนดีแค่ไหนก็ตาม ตรวจสอบให้แน่ใจว่านี่ไม่ได้เกิดขึ้นกับคุณ:

# Change the log location to suit your system. RewriteLog /var/log/apache-rw.log RewriteLogLevel 2

พารามิเตอร์เหล่านี้จะเปิดใช้งานหากคุณทำการรีสตาร์ท Apache อย่างนุ่มนวลเพื่อให้คุณสามารถรีไซเคิลได้และติดตามพฤติกรรม mod_rewrite อย่างใกล้ชิด เมื่อปัญหาของคุณได้รับการแก้ไขให้หมุน RewriteLogLevel กลับและฉลอง

จากประสบการณ์ของฉัน 100% ฉันพบว่า RewriteLog ช่วยให้ฉันค้นพบปัญหาด้วยกฎการเขียนซ้ำของฉัน ฉันไม่สามารถแนะนำสิ่งนี้ได้มากพอ ขอให้โชคดีในการแก้ไขปัญหาของคุณ!

นอกจากนี้บุ๊กมาร์กนี้เป็นเพื่อนที่ดีที่สุดของคุณ: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog


2

ทำงานได้ดีสำหรับฉัน (ใน Ubuntu):

sudo su
cd /etc/apache2/mods-enabled
ln ../mods-available/rewrite.load rewrite.load

นอกจากนี้ตามที่กล่าวมาแล้วตรวจสอบให้แน่ใจว่าAllowOverride allได้ตั้งค่าในส่วนที่เกี่ยวข้อง/etc/apache2/sites-available/default

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