如何检查服务器是否启用了mod_rewrite?

134

目前我正在使用安装了Lightspeed服务器的主机。主机商称已启用mod_rewrite,但我无法在该服务器上运行我的脚本。每当我尝试访问URL时,都会返回404-未找到页面。

我将相同的代码放在另一台运行Apache的服务器上。它在那里工作。所以我猜测这是.htaccessmod_rewrite的问题。

但是主机支持仍然坚称他们的mod_rewrite已经启用,所以我想知道如何检查它是否真正启用。

我尝试使用phpinfo()来检查,但没有成功,在那里我找不到mod_rewrite,这是因为他们正在使用Lightspeed吗?

有没有办法检查?请帮帮我。谢谢。

FYI: 我的.htaccess代码是:

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>

我也试过这样

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]

但是结果相同。


1
验证mod-rewrite是否启用的最简单方法是将一些随机文本粘贴到您的htaccess文件中,然后访问您的网站,如果该模块已启用,则会出现内部服务器错误。这是我几个月前写的一个快速的“htaccess入门教程”,https://helponnet.com/2021/04/15/htaccess-tutorial-for-beginers/ 希望您会发现它有用。 - Amit Verma
还可以阅读“如何检查htaccess是否有效”https://helponnet.com/2021/05/14/know-wether-htaccess-is-working-on-apache/ - Amit Verma
19个回答

145
从命令行输入以下内容:

sudo a2enmod rewrite

如果重写模式已经启用,它会告诉你!

sudo: a2enmod: 命令未找到,未启用... 通过 sudo a2enmod rewrite 安装并重启服务器 sudo service apache2 restart - Avatar
如果一切正常,将返回“模块重写已启用”。 - Leandro Bardelli

115
  1. 要检查mod_rewrite模块是否已启用,请在WAMP服务器的根文件夹中创建一个新的php文件。输入以下内容:

    phpinfo();

  2. 从浏览器访问你创建的文件。

  3. 按下CtrlF以打开搜索框。搜索“mod_rewrite”。如果已启用,你将看到它显示为“已加载的模块”。

  4. 如果没有启用,请打开httpd.conf(Apache配置文件)并查找以下行。

    #LoadModule rewrite_module modules/mod_rewrite.so

  5. 删除该行开头处的井号(“#”)并保存该文件。

  6. 重新启动你的Apache服务器。

  7. 从浏览器再次访问同一个php文件。

  8. 再次搜索“mod_rewrite”。现在应该能够找到它了。


9
我相信当PHP本身作为Apache模块运行时,phpinfo()会报告已加载的_Apache_模块。OP说PHP正在运行在Lightspeed上,它有自己的与mod_rewrite兼容的重写引擎。 - MrWhite
3
在第一步中,我必须输入:<?php echo phpinfo(); ?>。 - Greg Noe
10
请注意,如果您将PHP作为CGI应用程序运行(即phpinfo()的“服务器API”字段显示为“CGI/FastCGI”),则此方法将无法工作。 phpinfo()不会列出已启用的模块。 在这种情况下,请参阅如何在PHP CGI上检查mod_rewrite - Rory O'Kane

95

如果您正在使用虚拟主机配置文件,请确保相关的虚拟主机具有以下指令中的 AllowOverride All

<VirtualHost *:80>
        ...
    <Directory "directory/of/your/.htaccess">
        AllowOverride All
    </Directory>
</VirtualHost>
基本上,这意味着允许处理所有的.htaccess指令。

基本上,这意味着允许处理所有的.htaccess指令。


7
谢谢。我欠你一瓶百威啤酒。 <3 - Nishant Ghodke
<Directory ...> 中的 ... 是什么意思?我应该放什么?是 .htaccess 所在的目录吗? - João Pimentel Ferreira
是的,确实应该在引号中提到 "..." .htaccess 所在的目录。 - João Pimentel Ferreira
我复制了服务器上的配置文件,虽然我已经更改了“ServerName”,但是我没有更改目录名称,在重新启动Apache之后一切正常。 - D. Dan
2
如果这个答案对你有用并解决了你的问题,你应该将其标记为正确,并授予@Jahmic他应得的奖励。 - Sinthia V

27

这适用于CentOS:

$ sudo httpd -M |grep rewrite_module

应该输出 rewrite_module (shared)


这是在CentOS上执行的最佳方式,假设您拥有ssh访问权限。谢谢,@radtek! - John T.

19
如果apache_get_modules()函数未被识别或phpinfo()中没有有关该模块的信息,请尝试通过在.htaccess文件中添加以下行来测试mod_rewrite:
RewriteEngine On
RewriteRule ^.*$ mod_rewrite.php

还有mod_rewrite.php:

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

18

控制台:

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

sudo a2enmod rewrite
sudo service apache2 restart

我已经尝试了很多方法来解决这个问题,然后当我尝试这个方法时,它对我有效。我现在使用的是最新的Apache和Ubuntu系统。 - Fernando Sanchiz

16
如果。
in_array('mod_rewrite', apache_get_modules())

如果返回true,则表示mod-rewrite已启用。


通过PHP代码检查重写模块是否启用的完美一行解决方案。 - Shakeel Ahmed

16

PHP的预定义apache_get_modules()函数返回一个已启用模块的列表。要检查是否启用了mod_rewrite,您可以在您的服务器上运行以下脚本:

<?php
print_r(apache_get_modules());
?>
如果上面的示例失败了,您可以使用您的.htaccess文件验证mod-rewrite。在文档根目录中创建一个htaccess文件并添加以下rewriteRule:
RewriteEngine on

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

现在访问http://example.com/HelloWorld,您将被内部转发到站点的/index.php页面。否则,如果mod-rewrite被禁用,则会收到500个内部服务器错误。

希望这可以帮助您。


我使用7.2版本,apache_get_modules得到未定义的结果。在编辑.htaccess文件后,我需要重启Apache2吗? - Adi Prasetyo
1
不需要在使用htaccess时重启服务器。 - Amit Verma

15
你可以在终端上完成它,方法如下:

你可以在终端中完成它,具体有两个方式:

apachectl -M
apache2ctl -M
2daygeek获取

在Debian 9中,它可以工作,但您必须以root身份登录或使用'sudo'。 - androsfat

10
如果这段代码在你的 .htaccess 文件中(没有检查 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]

如果您访问站点上的任何页面时都会收到500服务器错误,我想可以肯定地说mod_rewrite已经开启了。


3
所以您可以访问网站上的某些页面而不会出现500错误?一般情况下,这意味着如果正在读取.htaccess文件,则mod_rewrite必须已经开启。但是,.htaccess文件可能没有被读取...请在.htaccess文件顶部写入一些无意义的字符,如果Apache实际上正在读取该文件,则会导致连接断开并出现500服务器错误。如果正在读取,请举一个您认为应该正常工作但却不起作用的URL示例。 - Clive
问题在于,它不是Apache服务器,而是Lightspeed。我从未遇到过500错误,我只遇到了404错误。这就是为什么我怀疑.htaccess没有启用的原因。 - knightrider
很可能是的,我建议将无意义的字符放入.htaccess文件中,然后尝试直接访问未重写的页面(例如index.php)是否会出现500错误。如果没有,那么最好发布一个新问题,询问如何在Lightspeed中启用.htaccess。 - Clive

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接