.htaccess không hoạt động apache


135

Tôi có một máy chủ từ dịch vụ AWS EC2 chạy trên Linux và tôi đã cài đặt apache, php và mysql.

Tôi đã thêm một .htaccesstập tin trong tài liệu gốc của tôi /var/www/html.

Tôi đã nhập mã này vào nó: ErrorDocument 404 /var/www/html/404.phpvà nó vẫn không hiển thị.

Tôi đã nhập lệnh này nhiều lần: sudo service httpd restartđể khởi động lại máy chủ nhưng không có thay đổi nào được hiển thị ...

Làm thế nào tôi có thể khắc phục điều này ... Tôi đã làm gì sai?

Cảm ơn trước!


2
Bạn có chắc chắn muốn ánh xạ 400 Bad Requestlỗi /var/www/html/404.php?
Jon Lin

Câu trả lời:


287

Đầu tiên, lưu ý rằng khởi động lại httpd là không cần thiết cho các tệp .htaccess. Các tệp .htaccess dành riêng cho những người không có quyền root - tức là không có quyền truy cập vào tệp cấu hình máy chủ httpd và không thể khởi động lại máy chủ. Vì bạn có thể khởi động lại máy chủ, bạn không cần tệp .htaccess và có thể sử dụng cấu hình máy chủ chính trực tiếp.

Thứ hai, nếu các tệp .htaccess bị bỏ qua, bạn cần kiểm tra xem cho phép AllowOverride được đặt chính xác. Xem http://httpd.apache.org/docs/2.4/mod/core.html#allowoverride để biết chi tiết. Bạn cũng cần đảm bảo rằng nó được đặt trong phạm vi chính xác - nghĩa là, trong khối bên phải trong cấu hình của bạn. Ví dụ, hãy chắc chắn rằng bạn KHÔNG chỉnh sửa cái trong khối.

Thứ ba, nếu bạn muốn đảm bảo rằng tệp .htaccess thực tế đang được đọc, hãy bỏ rác vào đó. Một dòng không hợp lệ, chẳng hạn như "INVALID LINE TẠI ĐÂY", trong tệp .htaccess của bạn, sẽ dẫn đến Lỗi 500 Máy chủ khi bạn trỏ trình duyệt của mình vào thư mục chứa tệp đó. Nếu không, thì bạn không có cấu hình AllowOverride chính xác.


141
+1 để đặt rác vào tệp .htaccess làm công cụ chẩn đoán.
retrohacker

46
Rác trong lập trình hữu ích hơn âm thanh.
EnKrypt

1
Tôi đã đưa "A STRING" vào .htaccess của mình, vì vậy tôi đã nhận được một lỗi, vì vậy tôi đã đưa AllowOverride Alltất cả apache2.confvào Debian của mình và nó hoạt động
Alex

1
Lưu ý rằng AllowOverridechỉ hoạt động trong các <Directory>chỉ thị và sẽ bị bỏ qua nếu được đặt trong một <Location ...>phần, xem: httpd.apache.org/docs/2.4/mod/core.html#allowoverride
Daniel Sokolowski

2
Cũng lưu ý rằng <Directory>chỉ thị mong đợi một đường dẫn tuyệt đối thay vì tương đối. Trong trường hợp của tôi, <Directory /> thất bại trong khi <Directory /var/www/html/subdir>làm việc.
Lukas Knuth

115
  1. Kích hoạt mô-đun mod_rewrite của Apache

    a2enmod rewrite

  2. thêm đoạn mã sau vào /etc/apache2/sites-available/default

    AllowOverride All

  3. Khởi động lại apache

    /etc/init.d/apache2 restart


7
lưu ý rằng trong Apache 2.4, các tệp cấu hình trong / etc / apache2 / site-Available phải kết thúc bằng .conf ngay bây giờ. Và tôi đã có một số kết hợp trên máy chủ của mình với default.conf trong / etc / apache2 / site-
Available

2
Cảm ơn, trong trường hợp của tôi, việc viết lại không được bật theo mặc định trong apache2
Cross

Tôi đã làm theo các bước này nhưng nó không hoạt động trong apache 2.4 những gì tôi đang làm sai = [
Luciano Andress Martini

Có vẻ như yêu cầu ghi đè ip yêu cầu xác thực, hành vi này là bất ngờ (cho phép một số ip nhất định trong apache 2.2 không làm điều này) và theo tôi có thể rất nguy hiểm, vì ngoại lệ ip đang kích hoạt xác thực, trong apache 2.2 chúng là những thứ hoàn toàn khác nhau !
Luciano Andress Martini

Tôi đã bỏ qua bước đầu tiên nhưng đã thay đổi AllowOverride thành Tất cả trong apache.conf của tôi (Debian 8, /etc/apache2/apache.conf), đã khởi động lại và các tệp không thể truy cập được, tốt. Nhưng lỗi không giống như quyền bị từ chối mà là Lỗi 500 máy chủ nội bộ, tại sao vậy? Tôi có thể sửa nó không?
dasLort

44

Nếu bạn đã thử tất cả các câu trả lời trên, tất cả đều là câu trả lời hợp lệ và tốt và tệp htaccess của bạn không hoạt động hoặc đang đọc, hãy thay đổi chỉ thị trong apache2.conftệp. Trong Ubuntu đường dẫn là/etc/apache2/apache2.conf

Thay đổi <Directory>chỉ thị trỏ đến các trang web công cộng của bạn, nơi tệp htaccess nằm. Thay đổi từ AllowOverride NonethànhAllowOverride All

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

Tôi đã có cùng một vấn đề và tìm thấy câu trả lời và giải thích trên Ubuntu Ask! diễn đàn https://askubfox.com/questions/421233/eneac-htaccess-file-to-rewrite-path-not- làm việc


2
Hoặc, nó có thể được thêm vào Vhost
ssi-anik

Trên thực tế, chỉ AllowOverride FileInfođược yêu cầu trong dòng thứ 3 để .htaccesstập tin được đọc và sử dụng. Allcũng cho phép ghi đè cấu hình bổ sung, chẳng hạn như .httpasswd(có thể được bật riêng bằng cách sử dụng Authconfigthay vì All).
Rafal

20

Đối với Ubuntu,
Đầu tiên, hãy chạy lệnh này: -

sudo a2enmod rewrite

Sau đó, chỉnh sửa tệp /etc/apache2/sites-available/000-default.confbằng nano hoặc vim bằng lệnh này: -

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

Sau đó trong 000-default.conftập tin, thêm điều này sau dòng DocumentRoot /var/www/html. Nếu thư mục html gốc của bạn là một cái gì đó khác, thì hãy viết rằng: -

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

Sau khi làm mọi thứ, khởi động lại apache bằng lệnh sudo service apache2 restart


6

Chỉ cần làm theo 3 bước

  1. Kích hoạt mode_rewrite bằng lệnh sau

    sudo a2enmod viết lại

Mật khẩu sẽ được hỏi. Vì vậy, nhập mật khẩu của bạn

  1. Cập nhật tệp 000-default.conf hoặc default.conf của bạn nằm trong thư mục / etc / apache2 / sites-Available / . bạn không thể chỉnh sửa nó trực tiếp. vì vậy sử dụng lệnh sau để mở

    sudo gedit /etc/apache2/sites-av Available / 000-default.conf

Hoặc sudo gedit /etc/apache2/sites-av Available / default.conf

bạn sẽ nhận được

Tài liệuRoot / var / www / html

HOẶC LÀ

Tài liệuRoot / var / www

hàng. Thêm mã sau đây.

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

Làm cho người dùng đường dẫn thẻ thư mục giống như hiển thị trong tệp của bạn.

  1. Khởi động lại máy chủ apache của bạn bằng lệnh sau

    sudo dịch vụ apache2 khởi động lại


Cảm ơn. Chúc mừng từ Brazil.
Fox.11

5

Rất có thể, AllowOverride được đặt thành Không có. trong phần Thư mục của apache2.conf nằm trong thư mục / etc / apache2

Hãy thử đặt nó thành AllowOverride All


5

Theo kinh nghiệm của tôi, chỉ thị / var / www / thư mục ngăn chặn các chỉ thị virtualhost của thư mục con. Vì vậy, nếu bạn đã thử tất cả các đề xuất mà vẫn không hoạt động và bạn đang sử dụng virtualhost, hãy thử điều này;

1 - Hãy chắc chắn rằng bạn có AllowOverride Allchỉ thị trong /etc/apache2/sites-available/example.com.conf

2 - Kiểm tra / var / www / Chỉ thị thư mục trong /etc/apache2/apache2.conf(có thể ở dòng 164), trông giống như;

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

Nếu có một lệnh AllowOverride Nonethay đổi nó thành AllowOverride All hoặc chỉ thoát dòng


3

Theo mặc định, Apache cấm sử dụng tệp .htaccess để áp dụng các quy tắc viết lại, vì vậy

Bước 1 - Kích hoạt mod_rewrite (nếu không được bật) Trước tiên, chúng ta cần kích hoạt mod_rewrite. Nó có sẵn nhưng không được kích hoạt với bản cài đặt Apache 2 sạch.

$ sudo a2enmod rewrite

Điều này sẽ kích hoạt mô-đun hoặc cảnh báo bạn rằng mô-đun đã được kích hoạt. Để thực hiện những thay đổi này, hãy khởi động lại Apache.

$ sudo systemctl restart apache2

mod_rewrite hiện đã được kích hoạt đầy đủ. Trong bước tiếp theo, chúng tôi sẽ thiết lập tệp .htaccess mà chúng tôi sẽ sử dụng để xác định quy tắc viết lại cho các chuyển hướng.

Bước 2 - Thiết lập .htaccess Mở tệp cấu hình Apache mặc định bằng nano hoặc trình soạn thảo văn bản yêu thích của bạn.

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

Trong tập tin đó, bạn sẽ tìm thấy một khối bắt đầu trên dòng đầu tiên. Bên trong khối đó, thêm khối mới sau đây để tệp cấu hình của bạn trông giống như sau. Hãy chắc chắn rằng tất cả các khối được thụt lề đúng cách.

/etc/apache2/sites-av Available / 000-default.conf

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

    . . . 
</VirtualHost>

Lưu và đóng tập tin. Để thực hiện những thay đổi này, hãy khởi động lại Apache.

$ sudo systemctl restart apache2

Làm xong. .Htacess của bạn nên làm việc. Liên kết này thực sự có thể giúp ai đó https://www.digitalocean.com/community/tutorials/how-to-rewrite-urls-with-mod_rewrite-for-apache-on-ub Ubuntu-16-04


Lệnh khởi động lại có hiệu quả với tôi là $ sudo httpd -k restart(Red Hat 4.4.7-23)
Himalaya Garg

3

Tôi đã xóa việc sử dụng này. Bằng cách sử dụng trang web này, nhấp vào đây , làm theo các bước, các bước tương tự tiếp theo cho đến phiên bản Ubuntu 18.04


1

Trong WampServerbiểu tượng Khay mở WampServer ----> Apache ---> Mô-đun Apache ---> viết lại_module



0

Để hoàn thiện, nếu "AllowOverride All" không khắc phục được sự cố của bạn, bạn có thể gỡ lỗi sự cố này bằng cách sử dụng:

  1. Chạy apachectl -Svà xem nếu bạn có nhiều hơn một namevhost. Có thể là httpd đang tìm kiếm .htaccess của một DocumentRoot khác.

  2. Sử dụng strace -f apachectl -Xvà tìm nơi tải (hoặc không tải) .htaccess từ đó.

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.