Cách bật mod_rewrite cho Apache 2.2


474

Tôi đã cài đặt Apache 2.2 mới trên máy Vista, mọi thứ đều hoạt động tốt, ngoại trừ việc viết lại mod.

Tôi đã không chú ý

LoadModule rewrite_module modules/mod_rewrite.s

nhưng không có quy tắc viết lại nào của tôi hoạt động, ngay cả những quy tắc đơn giản như

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

Tất cả các quy tắc tôi đang sử dụng đang làm việc trên máy chủ của tôi, vì vậy chúng sẽ ổn, vì vậy câu hỏi của tôi là, có điều gì ẩn trong cấu hình apache, có thể chặn việc viết lại mod không?


1
Trên thực tế, vấn đề là tôi đã có đường dẫn sai, vì $ {DOCUMENT_ROOT} đã chỉ cho tôi thư mục gốc, việc lưu trữ không ổn, nhưng sai về cục bộ, vì vậy vấn đề không chỉ là RewriteEngine On, mà tôi đã có ..
Jakub Arnold

Bạn có thể vui lòng thay đổi câu trả lời được chấp nhận cho câu hỏi này ? Tác giả của câu trả lời được chấp nhận hiện tại đã thừa nhận nó không đủ tốt.
Shadow Wizard là Ear For You

1
Cách bật mod_rewrite trong Ubuntu 12.04 LTS (cũng nên hoạt động trong Debian) . Điều này cho thấy cài đặt VÀ kích hoạt, các hướng dẫn bên dưới đáng ngạc nhiên không làm :(
Sliq

3
Tôi đặc biệt khuyên mọi người muốn kích hoạt các lệnh mod_rewrite trong các tệp .htacces để sử dụng AllowOverride FileInfothay vì cho phép mọi thứ, như TẤT CẢ các câu trả lời trên trang này gợi ý. Thật buồn khi thấy tất cả những câu trả lời này sử dụng phương pháp tiếp cận lâu dài thay vì cố gắng hiểu được hậu quả của "giải pháp" được đề xuất. Cố gắng hiểu những gì bạn đang làm trên máy chủ của bạn và làm thế nào để hạn chế các đặc quyền bạn vừa cho đi AllowOverride All. RTFM! , nó được bỏ rõ ràng về chủ đề này.
RemyNL

1
@Black Nó nằm trong tệp cấu hình Apache có tên httpd.conf. Trong PC của tôi, nó nằm trong thư mục C: \ xampp \ apache \ conf, vì tôi đã cài đặt Apache với XAMPP.
Lex Soft

Câu trả lời:


1005

Để sử dụng, mod_rewritebạn có thể gõ lệnh sau trong terminal:

sudo a2enmod rewrite

Khởi động lại apache2 sau

sudo /etc/init.d/apache2 restart

hoặc là

sudo service apache2 restart

hoặc theo cách điều khiển hệ thống thống nhất mới

sudo systemctl restart apache2

Sau đó, nếu bạn muốn, bạn có thể sử dụng .htaccesstệp sau .

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

Tệp ở trên .htaccess(nếu được đặt trong của bạn DocumentRoot) sẽ chuyển hướng tất cả lưu lượng truy cập đến một index.phptệp trong DocumentRoottrừ khi tệp tồn tại.

Vì vậy, giả sử bạn có cấu trúc thư mục sau và httpdocs là DocumentRoot

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

Bất kỳ tệp nào tồn tại trong httpdocs sẽ được cung cấp cho người yêu cầu bằng cách sử dụng .htaccesshiển thị ở trên, tuy nhiên, mọi thứ khác sẽ được chuyển hướng đến httpdocs/index.php. Các tập tin ứng dụng của bạn includes/appsẽ không thể truy cập được.


15
Các ý tưởng ở đây là chính xác cho UNIX CLI nhưng các lệnh chỉ hoạt động đối với các bản phân phối Linux dựa trên Debian và không phải là môi trường Windows của OP.
Jason Rikard

17
a2enmod viết lại đã thực hiện công việc
Tiến sĩ Casper Black

98
Hơn nữa lưu ý: bạn cũng cần phải đảm bảo rằng cấu hình trang web của bạn có AllowOverride Allđể cho các .htaccesstập tin được đọc ở tất cả.
Adam Rosenfield

2
@Dennis bạn có thể sử dụng viết lại a2dismod
Jonathan Mayhak

3
Làm thế nào tôi có thể sử dụng a2enmod rewritetrong windows?
Naman

229

Đối với tình hình của tôi, tôi đã có

RewriteEngine On

trong tôi .htaccess, cùng với mô-đun được tải, và nó không hoạt động.

Giải pháp cho vấn đề của tôi là chỉnh sửa mục nhập vhost của tôi thành inlcude

AllowOverride all

trong <Directory>phần cho trang web trong câu hỏi.


10
Thật vậy, ngay cả với a2enmod rewrite& RewriteEngine Ontrong .htaccess- sự tồn tại của AllowOverride alltệp Virtualhost sẽ ngăn không cho nó hoạt động - đây là điều khiến tôi bị loại, thay đổi nó thành AllowOverride allhoạt động như một bùa mê :)
HeavenCore

9
người mới bắt đầu ở đây .. tập tin Virtualhost ở đâu?
davneet

3
Đây là con đường để đi ... Tôi đã thiết lập mọi thứ khác ngoại trừ việc này.
mảng

2
Lệnh AllowOverridexác định "Các loại lệnh được phép trong .htaccesstệp". Hơn nữa, "Khi lệnh này được đặt thành None, thì .htaccesscác tệp sẽ bị bỏ qua hoàn toàn. Trong trường hợp này, máy chủ thậm chí sẽ không cố đọc .htaccesscác tệp trong hệ thống tệp." Tài liệu chính thức: httpd.apache.org/docs/2.2/mod/core.html#allowoverride
John Erck

Điều này đã khắc phục nó cho tôi - Tôi gặp sự cố với WordPress permalinks khá không hoạt động đúng. Nếu bạn làm a2enmod rewritevà sau đó trong tệp Virtualhosts, hãy thay đổi 'AllowOverride none' thành 'AllowOverride All', nó sẽ hoạt động. Tệp Virtualhosts áp dụng nếu bạn đang chạy nhiều tên miền cho cùng một máy chủ (và địa chỉ IP). Bạn sẽ thiết lập nó để thiết lập tên miền.
Jason Preston

83

Hãy thử cài đặt : AllowOverride All.


Vấn đề phổ biến thứ hai là không bật mod viết lại: a2enmod rewritevà sau đó khởi động lại apache.


Đây phải là câu trả lời số 1 vì nó giải quyết được một vấn đề đang xảy ra trong quá trình cài đặt ubfox mặc định!
Sliq

1
Điều này sẽ cho phép .htaccess ghi đè bất kỳ cấu hình apache nào khác. Điều này không được khuyến khích.
Bhargav Nanekalva

Vâng :) đây cũng là vấn đề của tôi, nhưng đây là nơi mà bạn đang giải thích cho những tân binh như tôi rằng "AllowOverride All" này nằm trong /etc/apache2/sites-av Available / [sitename [. .cs. Tôi đã phải làm một nghiên cứu thứ hai vì bạn: D, cảm ơn!
MetaTron

77

Nếu không phải các tác phẩm trên, hãy thử chỉnh sửa / etc / apache2 / sites-enable / 000-default

gần như ở trên đỉnh bạn sẽ tìm thấy

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

Thay đổi AllowOverride NonethànhAllowOverride All

cái này làm việc cho tôi


Đã thay đổi lỗi từ /laravel/public/authors was not found on this serversang/index.php was not found on this server
Gangaraju

Không thể tìm thấy <Thư mục>, chỉ <Virtualhost *: 80>
Nicolas S.Xu

1
@ NicolasS.Xu đặt cái này vào thẻ <Virtualhost *: 80>
wimdetr

Tôi đã làm tương tự nhưng chỉ thêm một phần mới <Directory /var/www/html>để áp dụng quy tắc từ thư mục này và chỉ lên.
Louis Loudog Trottier

44

Trong Ubuntu:

Chạy:

a2enmod rewrite

và sau đó:

service apache2 restart

mod_rewrite bây giờ sẽ được kích hoạt!


28

Có nhiều cách để bạn có thể khắc phục vấn đề này, nếu bạn biết gốc rễ của vấn đề.

Vấn đề 1

Đầu tiên, nó có thể là một vấn đề với apache của bạn không cài đặt hoặc kích hoạt mô-đun mod_rewrite.c.

Vì lý do này, bạn sẽ phải kích hoạt nó như sau

  1. Mở bàn điều khiển của bạn và gõ vào nó, cái này:

    sudo a2enmod rewrite

  2. Khởi động lại máy chủ apache của bạn.

    service apache2 restart

Vấn đề 2

  1. Ngoài ra, bạn cũng có thể, ngoài các cách trên, nếu nó không hoạt động, phải thay đổi quy tắc ghi đè từ tệp conf apache (có thể là apache2.conf, http.conf hoặc tệp mặc định 000).

  2. Xác định vị trí "Thư mục / var / www /"

  3. Thay đổi "Ghi đè Không" thành "Ghi đè tất cả"

Vấn đề 3

Nếu bạn không tìm thấy mô-đun ghi lại lỗi, thì có lẽ mô-đun userdir của bạn không được bật. Vì lý do này, bạn cần phải kích hoạt nó.

  1. Nhập cái này vào bàn điều khiển:

    sudo a2enmod userdir

  2. Sau đó thử bật mô-đun viết lại nếu vẫn không được bật (như đã đề cập ở trên).

Để đọc thêm về điều này, bạn có thể truy cập trang web này: http://seventhsoulmax.blogspot.com/2014/02/wordpress-permalink-ubfox-probols-solutions.html


2
Sự cố lớn của vấn đề.
Banago

Không sử dụng AllowOverride Allvì nó sẽ kích hoạt quá nhiều tính năng nguy hiểm (như sử dụng tập lệnh perl). Thay vào đó hãy sử dụngAllowOveride Options
Marki555

28

Phiên bản apache mới đã thay đổi theo một cách nào đó. Nếu phiên bản apache của bạn là 2.4 thì bạn phải vào /etc/apache2/. Sẽ có một tập tin được đặt tên apache2.conf. Bạn phải chỉnh sửa cái đó (bạn nên có quyền root). Thay đổi văn bản thư mục như thế này

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

Bây giờ khởi động lại apache.

service apache2 reload

Hy vọng nó hoạt động.


Đây là câu trả lời cập nhật.
paulc

1
Nếu bạn ở trong năm 2019 và hơn thế nữa, vui lòng nêu lên câu trả lời này :)
Luiz Cavalcanti

27

Mở terminal và typin a2enmod rewrite, Nó sẽ kích hoạt mod_rewritemô-đun của bạn cho Apache.

Sau đó đi đến /etc/apache2/sites-availablevà chỉnh sửa tập tin mặc định. (Đối với điều này, bạn phải có quyền ghi vào tệp này và thư mục có sẵn trên trang web.)

Thay thế bên dưới bằng các dòng hiện tại 4 đến 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>

Bây giờ khởi động lại apache của bạn bằng /etc/init.d/apache2 restarthoặcservice apache2 restart

Hãy kiểm tra URL sạch một lần nữa và lần này nó sẽ được thông qua.


15

<chỉnh sửa>

Chỉ cần lưu ý rằng bạn đã nói mod_rewrite.s thay vì mod_rewrite.so - hy vọng đó là một lỗi đánh máy trong câu hỏi của bạn chứ không phải trong tệp httpd.conf! :)

</ chỉnh sửa>

Tôi đã quen với việc sử dụng Apache trên Linux, nhưng tôi đã phải làm điều này vào một ngày khác.

Trước hết, hãy xem trong thư mục cài đặt Apache của bạn. (Tôi sẽ giả sử bạn đã cài đặt nó vào "C: \ Program Files" tại đây)

Hãy xem trong thư mục: "C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ mô-đun" và đảm bảo rằng có một tệp có tên mod_rewrite.so trong đó. (Đáng lẽ ra, nó được cung cấp như một phần của cài đặt mặc định.

Tiếp theo, mở "C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ conf" và mở httpd.conf. Đảm bảo dòng:

#LoadModule rewrite_module modules/mod_rewrite.so

không bị lỗi

LoadModule rewrite_module modules/mod_rewrite.so

Ngoài ra, nếu bạn muốn bật RewriteEngine theo mặc định, bạn có thể muốn thêm một cái gì đó như

<IfModule mod_rewrite>
    RewriteEngine On
</IfModule>

đến cuối tệp httpd.conf của bạn.

Nếu không, hãy chắc chắn rằng bạn chỉ định

RewriteEngine On

một nơi nào đó trong tập tin .htaccess của bạn.


@gabehabe hình đại diện của bạn trông giống như nó đang giữ một biểu tượng tài liệu của tôi, lol
Jonathan dos Santos

5

Tôi vừa mới làm điều này

sudo a2enmod rewrite

sau đó bạn phải khởi động lại dịch vụ apache bằng lệnh sau

sudo service apache2 restart

4

Chủ đề cũ, chỉ muốn đặt mà không đặt AllowOverride thành tất cả thay vào đó sử dụng mod cụ thể mà bạn muốn sử dụng,

AllowOverride mod_rewrite mod_mime

Và dòng này nên được bình luận

LoadModule rewrite_module modules/mod_rewrite.so

Chuyển hướng


4

Sử dụng lệnh dưới đây

sudo a2enmod rewrite

Và apache khởi động lại thông qua lệnh dưới đây

sudo service apache2 restart

3

Rõ ràng có nhiều hơn một cách để làm điều đó, nhưng tôi sẽ đề nghị sử dụng tiêu chuẩn hơn:

ErrorDocument 404 /index.php?page=404

3

Lần đầu tiên tôi vật lộn với các quy tắc mod_rewrite bỏ qua lưu lượng truy cập của mình, tôi đã biết (bực bội) rằng tôi đã đặt chúng sai <VirtualHost>, điều đó có nghĩa là lưu lượng truy cập của tôi sẽ bỏ qua tất cả chúng cho dù chúng được viết tốt như thế nào. Hãy chắc chắn rằng điều này không xảy ra với bạn:

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

Các tham số này sẽ kích hoạt nếu bạn thực hiện khởi động lại duyên dáng của Apache, vì vậy bạn có thể tái chế chúng và theo dõi chặt chẽ hành vi mod_rewrite. Khi vấn đề của bạn đã được khắc phục, hãy quay lại RewriteLogLevel và ăn mừng.

Trong 100% kinh nghiệm của tôi, tôi đã thấy rằng RewriteLog đã giúp tôi khám phá vấn đề với các quy tắc viết lại của mình. Tôi không thể đề nghị điều này đủ. Chúc may mắn trong việc khắc phục sự cố của bạn!

Ngoài ra, dấu trang này là người bạn tốt nhất của bạn: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog


2

Điều gì làm việc cho tôi (trong Ubuntu):

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

Ngoài ra, như đã đề cập, đảm bảo AllowOverride allđược đặt trong phần có liên quan của/etc/apache2/sites-available/default

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.