122

目前我正在使用带有光速服务器的主机。托管说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]

但同样的结果。

4

18 回答 18

130

从命令行,键入

sudo a2enmod 重写

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

于 2016-06-08T05:16:51.337 回答
105
  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”。您现在应该可以找到它。

于 2012-06-05T03:50:11.787 回答
88

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

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

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

于 2013-09-13T14:47:54.483 回答
19

这适用于 CentOS:

$ sudo httpd -M |grep rewrite_module

应该输出rewrite_module (shared)

于 2017-01-29T14:47:24.137 回答
18

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

RewriteEngine On
RewriteRule ^.*$ mod_rewrite.php

和 mod_rewrite.php:

<?php echo "Mod_rewrite is activated!"; ?>
于 2014-10-13T09:06:18.257 回答
18

安慰:

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

sudo a2enmod rewrite
sudo service apache2 restart
于 2013-10-11T13:21:03.007 回答
15

如果

in_array('mod_rewrite', apache_get_modules())

返回true然后启用 mod-rewrite。

于 2013-12-02T17:53:31.977 回答
15

PHP 的 perdefinedapache_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 内部服务器错误。

希望这可以帮助。

于 2017-02-25T04:47:10.453 回答
14

您可以在终端上执行此操作,或者:

apachectl -M
apache2ctl -M

取自2daygeek

于 2018-01-05T11:42:53.817 回答
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 已打开。

于 2011-09-07T17:05:53.607 回答
5

你可以使用php函数

      apache_get_modules

并检查 mod_rewrite

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

http://in2.php.net/apache_get_modules

于 2012-06-05T06:35:16.113 回答
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

于 2016-11-16T22:17:49.417 回答
5

我知道这个问题很老,但是如果您可以将 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>
于 2018-10-17T14:02:42.713 回答
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>

并运行此页面,然后查找将能够知道模块是否可用,如果没有,那么您可以询问您的主机,或者如果您想在本地机器上启用它,然后检查这个与在 wamp apache 中启用重写模块相关的 youtube 分步教程 https://youtu.be/xIspOX9FuVU?t=1m43s Wamp 服务器图标 -> Apache -> Apache Modules 并检查 rewrite module 选项

于 2016-10-11T07:23:03.437 回答
2

这段代码对我有用:

if (strpos(shell_exec('/usr/local/apache/bin/apachectl -l'), 'mod_rewrite') !== false) echo "mod_rewrite enabled";
else echo "mod_rewrite disabled";
于 2018-08-08T11:24:23.610 回答
1

首先检查是否安装了模块

apachectl -M

它没有显示在列表中,您必须激活它:

a2enmod rewrite

现在,重新启动服务器并测试

systemctl restart apache2
于 2021-09-22T11:59:04.267 回答
1

您只需要通过键入来检查文件是否存在

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

结果行可能不会以#

于 2018-01-06T23:40:16.427 回答
0

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

希望这可以减轻我在发现它到底出了什么问题时所经历的压力。

于 2018-01-21T19:07:35.110 回答