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


104

目前,我正在将主机与lightspeed服务器一起使用。托管说mod_rewrite已启用,但我无法在那里运行脚本。每当我尝试访问URL时,它都会返回404-找不到页面。

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

但是托管支持仍然坚持要求我启用他们的mod_rewrite,因此我想知道如何检查它是否真正启用。

我试着核对一下phpinfo(),但没有运气,我找不到mod_rewrite那里,是因为他们正在使用lightspeed吗?

有什么办法可以检查吗?请帮帮我。谢谢。

仅供参考:我的.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]

但结果相同。

Answers:



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

    phpinfo();

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

  3. CtrlF打开搜索。搜索“ mod_rewrite”。如果启用,则将其视为“已加载的模块”

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

    #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 2012年

2
第一步,我必须输入:<?php echo phpinfo(); ?>
Greg Noe

6
请注意,如果您将PHP作为CGI应用程序运行,则此方法将不起作用(如果phpinfo()“服务器API”字段显示“ CGI / FastCGI”,情况就是这样)。phpinfo()不会列出已启用的模块。在这种情况下,请参见如何在PHP CGI上检查mod_rewrite
罗里·奥肯

67

如果您使用的是虚拟主机配置文件,请确保所讨论的虚拟主机的指令AllowOverride All如下所示:

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

基本上,这表示允许处理所有.htaccess指令。


3
谢谢。我欠你百威。<3
Nishant Ghodke '16

...in 是什么意思<Directory ...>?我该放什么?.htaccess所在的目录?
若奥·皮门特尔·费雷拉

是的,这些...引号之间应该提到“......”这里的.htaccess是目录
若昂·皮门特尔·费雷拉

它有过。我从服务器复制了conf文件,更改了时ServerName,我没有更改目录名称,此后通过apache重新启动就可以了。
D. Dan

1
理查德如果此答案对您有用并解决了您的问题,则应将其标记为正确,并授予@Jahmic他应得的。
Sinthia V

18

如果apache_get_modules()无法识别或phpinfo()中没有有关此模块的信息;尝试通过在.htaccess文件中添加以下行来测试mod重写:

RewriteEngine On
RewriteRule ^.*$ mod_rewrite.php

和mod_rewrite.php:

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

15

安慰:

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

sudo a2enmod rewrite
sudo service apache2 restart

我已经尝试了很多方法来解决此问题,然后在尝试时对我有用。我现在有最后一个Apache和Ubuntu。
Fernando Sanchiz '16

15

如果

in_array('mod_rewrite', apache_get_modules())

返回,true然后启用mod-rewrite。


完美的一站式解决方案,用于检查是否通过PHP代码启用了重写模块。
沙克·艾哈迈德

12

PHP的perdefined 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 Internel服务器错误。

希望这可以帮助。


我使用7.2,apache_get_modules不确定。编辑后是否需要重新启动apache2 .htaccess
Adi Prasetyo

1
不,使用htaccess时不需要重新启动服务器。
阿米特·艾玛


11

这适用于CentOS:

$ sudo httpd -M |grep rewrite_module

应该输出 rewrite_module (shared)


假设您具有ssh访问权限,这是在CentOS上执行此操作的最佳方法。谢谢@ radtek!
John T.19年

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 2011年

是最有可能的,我尝试将废话字符放到.htaccess中,看看直接进入未重写的页面(例如index.php)时是否出现500错误。如果没有,可能值得发布一个新问题,询问如何使用Lightspeed启用.htaccess
Clive


5

如果您使用的是Linux系统,则可以在以下文件夹中检查apache2的所有启用模块(在我的情况下):/ etc / apache2 / mods-available

cd /etc/apache2/mods-available

键入:ll -a
如果要检查php的可用模块(在本例中为php 7)文件夹/etc/php/7.0/mods-available

cd /etc/php/7.0/mods-available

输入: ll -a


4

只需创建一个新页面并添加此代码

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

并运行此页面,然后找到能够知道模块是否可用的信息(如果不可用),则可以询问您的主机,或者是否要在本地计算机中启用它,然后检查此youtube逐步教程,以在wamp apache中启用重写模块 https://youtu.be/xIspOX9FuVU?t=1m43s Wamp服务器图标-> Apache-> Apache Modules,然后检查重写模块选项


2

我知道这个问题很旧,但是如果您可以将Apache配置文件编辑AllowOverride AllAllowOverride 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>

最好告诉您确切的名称以及在可能的情况下需要更改的文件的位置。这将对新来者有所帮助。谢谢
MindRoasterMir

还应记住,更改仅在重述了Apache之后才生效。谢谢
MindRoasterMir


1

这段代码对我有用:

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

0

我遇到了确切的问题,我通过单击自定义结构,然后添加/index.php/%postname%/并解决了问题

希望这可以减轻某人的压力,而这正是我经历的麻烦所在。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.