Làm cách nào để kiểm tra xem mod_rewrite có được bật trên máy chủ hay không?


104

Hiện tại tôi đang sử dụng hosting có máy chủ lightspeed . Lưu trữ cho biết đã mod_rewriteđược kích hoạt nhưng tôi không thể làm cho tập lệnh của mình hoạt động ở đó. Bất cứ khi nào tôi cố gắng truy cập URL, nó trả về 404 - không tìm thấy trang.

Tôi đặt các mã tương tự tại một máy chủ khác đang chạy với Apache. Nó đang hoạt động ở đó. Vì vậy, tôi đoán, đó là .htaccessmod_rewritevấn đề.

Nhưng bộ phận hỗ trợ lưu trữ vẫn khăng khăng với tôi rằng mod_rewrite của họ đang bật, vì vậy tôi muốn biết cách kiểm tra xem nó có thực sự được bật hay không.

Tôi đã cố gắng để kiểm tra phpinfo(), nhưng không may, tôi không thể tìm thấy mod_rewriteở đó, có phải do họ đang sử dụng lightspeed?

Có cách nào để kiểm tra không? Hãy giúp tôi ra. Cảm ơn bạn.

FYI:.htaccess mã của tôi là

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>

Tôi cũng đã thử như thế này

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]

Nhưng cùng một kết quả.

Câu trả lời:


98

từ dòng lệnh, nhập

sudo a2enmod viết lại

nếu chế độ viết lại đã được bật, nó sẽ cho bạn biết như vậy!


Đây là cách dễ nhất để kích hoạt tính năng viết lại mod.
andromeda

3
ĐÚNG ! Hoàn hảo, hoàn hảo.
George Dimitriadis

Đã làm việc. Đơn giản và dễ dàng. Cảm ơn
biplab rout

96
  1. Để kiểm tra xem mô-đun mod_rewrite đã được bật chưa, hãy tạo một tệp php mới trong thư mục gốc của máy chủ WAMP của bạn. Nhập theo chỉ dẫn

    phpinfo();

  2. Truy cập tệp đã tạo của bạn từ trình duyệt của bạn.

  3. CtrlFđể mở tìm kiếm. Tìm kiếm 'mod_rewrite'. Nếu nó được bật, bạn sẽ thấy nó là 'Mô-đun đã tải'

  4. Nếu không, hãy mở httpd.conf (tệp Cấu hình Apache) và tìm dòng sau.

    #LoadModule rewrite_module modules/mod_rewrite.so

  5. Bỏ dấu thăng ('#') ở đầu và lưu tệp này.

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

  7. Truy cập cùng một tệp php trong trình duyệt của bạn.

  8. Tìm kiếm lại 'mod_rewrite'. Bạn sẽ có thể tìm thấy nó ngay bây giờ.


9
Tôi tin rằng phpinfo () báo cáo Mô-đun được tải Apache khi bản thân PHP đang được chạy dưới dạng mô-đun Apache. OP nói rằng PHP đang chạy trên Lightspeed, có công cụ viết lại tương thích mod_rewrite của riêng nó.
MrWhite

2
Đối với bước đầu tiên, tôi phải nhập: <? Php echo phpinfo (); ?>
Greg Noe

6
Lưu ý rằng phương pháp này sẽ không hoạt động nếu bạn đang chạy PHP dưới dạng ứng dụng CGI (trường hợp này xảy ra nếu trường phpinfo()“API máy chủ” hiển thị “CGI / FastCGI”). phpinfo()sẽ không liệt kê các mô-đun đã bật. Trong trường hợp đó, hãy xem Cách kiểm tra mod_rewrite trên PHP CGI .
Rory O'Kane

67

Nếu bạn đang sử dụng tệp cấu hình máy chủ ảo, hãy đảm bảo máy chủ ảo được đề cập có lệnh AllowOverride Allở đâu đó như sau:

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

Về cơ bản, điều này cho phép xử lý tất cả các lệnh .htaccess.


3
Cảm ơn. Tôi nợ bạn một Budweiser. <3
Nishant Ghodke

điều đó có nghĩa là ...trong <Directory ...>? Tôi sẽ đặt gì ở đó? thư mục mà .htaccess là?
João Pimentel Ferreira

Có thực sự, ... nên đề cập đến giữa dấu ngoặc kép "..." thư mục nơi .htaccess là
João Ferreira Pimentel

Nó đã có. Tôi đã sao chép tệp conf từ máy chủ và trong khi tôi đã thay đổi ServerName, tôi đã không thay đổi tên thư mục, sau đó và một apache khởi động lại là ok.
D. Dan

1
RichardNếu câu trả lời này phù hợp với bạn và giải quyết được vấn đề của bạn, bạn nên đánh dấu nó là đúng và trao giải cho @Jahmic.
Sinthia V

18

Nếu apache_get_modules () không được nhận dạng hoặc không có thông tin về mô-đun này trong phpinfo (); thử kiểm tra khả năng viết lại mod bằng cách thêm những dòng đó vào tệp .htaccess của bạn:

RewriteEngine On
RewriteRule ^.*$ mod_rewrite.php

Và mod_rewrite.php:

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

15

bảng điều khiển:

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

sudo a2enmod rewrite
sudo service apache2 restart

Tôi đã cố gắng rất nhiều để giải quyết vấn đề này và sau đó khi thử nó sẽ hiệu quả với tôi. Tôi có apache cuối cùng và ubuntu bây giờ.
Fernando Sanchiz

15

Nếu

in_array('mod_rewrite', apache_get_modules())

trả về truesau đó mod-rewrite được kích hoạt.


Giải pháp một dòng hoàn hảo để kiểm tra mô-đun viết lại có kích hoạt hay không thông qua mã PHP.
Shakeel Ahmed

12

Hàm perdefined của PHP apache_get_modules()trả về danh sách các mô-đun đã bật. Để kiểm tra xem đã mod_rewriteđược bật chưa, bạn có thể chạy tập lệnh sau trên máy chủ của mình:

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

Nếu ví dụ trên không thành công, bạn có thể xác minh mod-rewrite bằng cách sử dụng .htaccesstệp của mình .

Tạo một htaccesstệp trong thư mục gốc và thêm rewriteRule sau:

RewriteEngine on

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

Bây giờ hãy truy cập http://example.com/HelloWorld , Bạn sẽ được chuyển tiếp nội bộ đến trang /index.php của trang web của bạn. Ngược lại, nếu mod-rewrite bị vô hiệu hóa, bạn sẽ gặp lỗi máy chủ 500 Internel.

Hi vọng điêu nay co ich.


tôi sử dụng 7.2, apache_get_modules chưa được xác định. Tôi có phải khởi động lại apache2 sau khi chỉnh sửa .htaccesskhông?
Adi Prasetyo

1
Không, bạn không cần phải khởi động lại máy chủ của mình khi sử dụng htaccess.
Amit Verma

12

bạn có thể làm điều đó trên thiết bị đầu cuối:

apachectl -M
apache2ctl -M

lấy từ 2daygeek


Trong Debian 9, nó không làm việc nhưng bạn phải đăng nhập như là người chủ hoặc sử dụngsudo
androsfat

11

Điều này hoạt động trên CentOS:

$ sudo httpd -M |grep rewrite_module

Nên xuất rewrite_module (shared)


Đây là cách tốt nhất để thực hiện trên CentOS, giả sử bạn có quyền truy cập ssh. Cảm ơn, @radtek!
John T.

10

Nếu mã này nằm trong tệp .htaccess của bạn (không có kiểm tra cho 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]

và bạn có thể truy cập bất kỳ trang nào trên trang web của mình với lỗi máy chủ 500, tôi nghĩ có thể an toàn khi nói rằng tính năng ghi lại bản sửa đổi được bật.


3
Vì vậy, bạn có thể truy cập một số trang trên trang web mà không gặp lỗi 500? Điều đó thường có nghĩa là nếu tệp .htaccess đang được đọc thì mod_rewrite phải được bật. Tuy nhiên, tệp .htaccess có thể không được đọc ... hãy thử viết một số ký tự vô nghĩa ở đầu tệp .htaccess của bạn, điều này sẽ khiến kết nối chết với lỗi máy chủ 500 nếu Apache thực sự đang đọc tệp. Nếu nó đang được đọc, bạn có thể đưa ra một ví dụ về một URL mà bạn nghĩ nên hoạt động nhưng không?
Clive

vấn đề là, nó không phải là máy chủ apache, nó có tốc độ ánh sáng. Tôi không bao giờ gặp lỗi 500, tất cả những gì tôi nhận được là lỗi 404. Đó là lý do tại sao tôi nghi ngờ rằng .htaccess không được kích hoạt.
Knightrider

Rất có thể là có, tôi sẽ thử đưa các ký tự vô nghĩa vào .htaccess và xem liệu bạn có gặp lỗi 500 khi truy cập trực tiếp vào một trang không được viết lại (ví dụ: index.php) hay không. Nếu không, có thể đáng để đăng một câu hỏi mới hỏi cách bật .htaccess với Lightspeed
Clive

5

Bạn có thể sử dụng hàm php

      apache_get_modules

và kiểm tra mod_rewrite

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

http://in2.php.net/apache_get_modules


2
apache_get_modules () sẽ chỉ hoạt động nếu PHP đang chạy dưới dạng mô-đun Apache. OP tuyên bố rằng PHP đang chạy trên Lightspeed.
MrWhite

5

Nếu bạn đang sử dụng hệ thống linux, bạn có thể kiểm tra tất cả các mô-đun kích hoạt cho apache2 (trong trường hợp của tôi) trong thư mục sau: / etc / apache2 / mods-available

cd /etc/apache2/mods-available

để gõ: ll -a
nếu bạn muốn kiểm tra các mô-đun có sẵn cho thư mục php (trong trường hợp này là php 7) /etc/php/7.0/mods-available

cd /etc/php/7.0/mods-available

đánh máy: ll -a


4

chỉ cần tạo một trang mới và thêm mã này

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

và chạy trang này sau đó tìm sẽ có thể biết mô-đun là Có sẵn hay không nếu không thì bạn có thể yêu cầu lưu trữ của bạn hoặc nếu bạn muốn kích hoạt nó trong máy cục bộ thì hãy kiểm tra hướng dẫn từng bước trên youtube này liên quan đến bật viết lại mô-đun trong wamp apache https://youtu.be/xIspOX9FuVU?t=1m43s Biểu tượng máy chủ Wamp -> Apache -> Mô-đun Apache và kiểm tra tùy chọn mô-đun viết lại


2

Tôi biết câu hỏi này đã cũ nhưng nếu bạn có thể chỉnh sửa tệp cấu hình Apache của mình thành AllowOverride Alltừ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>

Bạn nên cho biết chính xác tên và vị trí của tệp cần được thay đổi khi có thể. Nó sẽ hữu ích cho những người mới. Cảm ơn
MindRoasterMir

Cũng cần lưu ý rằng các thay đổi chỉ có hiệu lực sau khi bạn đã khôi phục lại apache của mình. cảm ơn
MindRoasterMir

1

Bạn chỉ cần kiểm tra xem tệp có ở đó hay không, bằng cách nhập

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

Dòng kết quả có thể không được nhận xét bắt đầu bằng #


1

Mã này phù hợp với tôi:

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

0

Tôi đang gặp sự cố chính xác, tôi đã giải quyết nó bằng cách nhấp vào cấu trúc tùy chỉnh, sau đó thêm /index.php/%postname%/và nó hoạt động

Hy vọng điều này sẽ giúp ai đó bớt căng thẳng mà tôi đã trải qua khi tìm ra cái quái gì xảy ra với nó.

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.