如何为 Apache 2.2 启用mod_rewrite

How to enable mod_rewrite for Apache 2.2

提问人:Jakub Arnold 提问时间:5/15/2009 更新时间:6/2/2020 访问量:1510532

问:

我已经在我的 Vista 机器上全新安装了 Apache 2.2,除了 mod 重写之外,一切正常。

我已经取消了评论

LoadModule rewrite_module modules/mod_rewrite.s

但是我的重写规则都不起作用,即使是像这样的简单规则

RewriteRule not_found %{DOCUMENT_ROOT}/index.php?page=404

我使用的所有规则都在我的主机上工作,所以它们应该没问题,所以我的问题是,apache配置中是否有任何隐藏的东西,可以阻止mod重写?

Apache mod-rewrite

评论

1赞 Jakub Arnold 5/16/2009
实际上问题是我的路径错误,因为 ${DOCUMENT_ROOT} 将我指向根目录,该目录在托管时没问题,但在本地上是错误的,所以问题不仅仅是我已经拥有的 RewriteEngine On。
0赞 Shadow Wizard Is Sad And Angry 1/7/2014
你能把公认的答案改成这个吗?目前公认的答案的作者承认这还不够好。
1赞 Sliq 2/4/2014
如何在 Ubuntu 中启用mod_rewrite 12.04 LTS(也应该在 Debian 中工作)。这显示了安装和激活,下面的教程令人惊讶地没有做:(
3赞 RemyNL 12/13/2016
我强烈建议所有想要在 .htacces 文件中启用mod_rewrite指令的人使用,而不是允许所有内容,正如本页上的所有答案所建议的那样。可悲的是,所有这些答案都采取了只要有效就可以的方法,而不是试图理解所提出的“解决方案”的后果。尝试了解您在服务器上正在做什么以及如何限制您刚刚放弃的权限。RTFM!,在这个问题上很清楚。AllowOverride FileInfoAllowOverride All
2赞 Lex Soft 11/6/2019
@Black 它位于名为 httpd.conf 的 Apache 配置文件中。在我的 PC 中,它位于目录 C:\xampp\apache\conf 中,因为我安装了带有 XAMPP 的 Apache。

答:

3赞 Michael Cramer 5/15/2009 #1

显然有不止一种方法可以做到这一点,但我建议使用更标准的方法:

ErrorDocument 404 /index.php?page=404
15赞 Danny Battison 5/17/2009 #2

<编辑>

刚刚注意到你说的是 mod_rewrite.s 而不是 mod_rewrite.so - 希望这是您的问题中的错别字,而不是 httpd.conf 文件中的错别字!:)

</编辑>

我更习惯于在 Linux 上使用 Apache,但前几天我不得不这样做。

首先,查看您的Apache安装目录。(我假设您在此处将其安装到“C:\Program Files”)

查看文件夹:“C:\Program Files\Apache Software Foundation\Apache2.2\modules”,并确保其中有一个名为 mod_rewrite.so 的文件。(它应该是,它是作为默认安装的一部分提供的。

接下来,打开“C:\Program Files\Apache Software Foundation\Apache2.2\conf”并打开 httpd.conf。确保以下行:

#LoadModule rewrite_module modules/mod_rewrite.so

未注释:

LoadModule rewrite_module modules/mod_rewrite.so

此外,如果要默认启用 RewriteEngine,则可能需要添加类似

<IfModule mod_rewrite>
    RewriteEngine On
</IfModule>

添加到 httpd.conf 文件的末尾。

如果没有,请确保指定

RewriteEngine On

.htaccess 文件中的某个位置。

评论

0赞 Jonathan DS 4/25/2018
@gabehabe你的头像看起来就像拿着一个图标我的文档,哈哈
247赞 Mike Wazowski 2/25/2011 #3

对于我的情况,我有

RewriteEngine On

在我的 中,以及正在加载的模块,它不起作用。.htaccess

我的问题的解决方案是编辑我的 vhost 条目以包括

AllowOverride all

在相关网站的部分中。<Directory>

评论

12赞 HeavenCore 2/19/2013
事实上,即使 & 在 - VirtualHost 文件中的存在会阻止它工作 - 这就是吸引我的原因,将其更改为像魅力:)a2enmod rewriteRewriteEngine On.htaccessAllowOverride allAllowOverride all
9赞 davneetnarang 2/22/2013
初学者在这里..VirtualHost文件在哪里?
3赞 ipruthi 3/17/2013
这是要走的路......除了这个,我设置了其他所有东西。
2赞 John Erck 4/28/2013
该指令确定“文件中允许的指令类型”。此外,“当此指令设置为 时,文件将被完全忽略。在这种情况下,服务器甚至不会尝试读取文件系统中的文件。官方文档:httpd.apache.org/docs/2.2/mod/core.html#allowoverrideAllowOverride.htaccessNone.htaccess.htaccess
0赞 Jason Preston 3/11/2014
这为我解决了这个问题——我遇到了一个问题,WordPress 漂亮的永久链接无法正常工作。如果您这样做,然后在 VirtualHosts 文件中将“AllowOverride None”更改为“AllowOverride All”,它应该可以工作。如果对同一服务器(和 IP 地址)运行多个域名,则 VirtualHosts 文件适用。您可以将其设置为设置域。a2enmod rewrite
1135赞 Jonathan Mayhak 4/23/2011 #4

为了使用,您可以在终端中键入以下命令:mod_rewrite

sudo a2enmod rewrite

在以下时间后重新启动 apache2

sudo /etc/init.d/apache2 restart

sudo service apache2 restart

或根据新的统一系统控制方式

sudo systemctl restart apache2

然后,如果您愿意,可以使用以下文件。.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

上述文件(如果放置在您的 )会将所有流量重定向到 中的文件,除非该文件存在。.htaccessDocumentRootindex.phpDocumentRoot

因此,假设您有以下目录结构,并且 httpdocs 是DocumentRoot

httpdocs/
    .htaccess
    index.php
    images/
        hello.png
    js/
        jquery.js
    css/
        style.css
includes/
    app/
        app.php

httpdocs 中存在的任何文件都将使用上面所示提供给请求者,但是,其他所有内容都将重定向到 .您的应用程序文件将无法访问。.htaccesshttpdocs/index.phpincludes/app

评论

16赞 Jason Rikard 7/22/2011
这里的想法对于 UNIX CLI 是正确的,但这些命令仅适用于基于 Debian 的 Linux 发行版,而不适用于 OP 的 Windows 环境。
17赞 Dr Casper Black 9/25/2011
a2enmod 重写完成了这项工作
108赞 Adam Rosenfield 6/23/2012
进一步注意:您还需要确保站点的配置具有才能读取文件。AllowOverride All.htaccess
3赞 Jonathan Mayhak 1/9/2014
@Dennis你可以使用 a2dismod 重写
5赞 Naman 1/30/2016
如何在 Windows 中使用?a2enmod rewrite
96赞 Jarrod 11/4/2011 #5

尝试设置:。AllowOverride All


第二个最常见的问题是没有启用mod rewrite:然后重新启动apache。a2enmod rewrite

评论

0赞 Sliq 7/12/2013
这应该是 #1 答案,因为它解决了默认 ubuntu 安装中发生的问题!
2赞 Bhargav Nanekalva 1/9/2014
这将允许 .htaccess 覆盖任何其他 apache 配置。不建议这样做。
2赞 MetaTron 4/20/2020
是:)这也是我的问题,但这里是你为像我这样的新手解释的地方,这个“AllowOverride All”在 /etc/apache2/sites-available/[sitename].conf 和 [sitename-ssl].conf 中。因为你:D,我不得不做第二次研究,顺便说一句,谢谢!
49赞 nickleefly 7/11/2012 #6

在 Ubuntu 中:

跑:

a2enmod rewrite

然后:

service apache2 restart

mod_rewrite现在将启用!

92赞 Martin Sax 8/7/2012 #7

如果以上方法都不起作用,请尝试编辑 /etc/apache2/sites-enabled/000-default

几乎在顶部你会发现

<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

将 更改为AllowOverride NoneAllowOverride All

这对我有用

评论

0赞 Gangaraju 10/28/2013
将错误从 更改为/laravel/public/authors was not found on this server/index.php was not found on this server
1赞 Nicolas S.Xu 8/9/2017
找不到<目录>,只有<VirtualHost *:80>
1赞 wimdetr 8/17/2017
@NicolasS.Xu 将其放在 <VirtualHost *:80> 标记中
2赞 Louis Loudog Trottier 5/2/2018
我做了同样的事情,但添加了一个新部分来应用此文件夹中的规则。<Directory /var/www/html>
3赞 Benubird 2/7/2014 #8

什么对我有用(在 ubuntu 中):

sudo su
cd /etc/apache2/mods-enabled
ln ../mods-available/rewrite.load rewrite.load

此外,如前所述,请确保在AllowOverride all/etc/apache2/sites-available/default

35赞 Kripa Jayakumar 2/9/2014 #9

如果您知道问题的根源,有很多方法可以解决此问题。

问题 1

首先,可能是您的 apache 没有安装或启用 mod_rewrite.c 模块的问题。

因此,您必须按如下方式启用它

  1. 打开您的控制台并在其中键入:

    sudo a2enmod rewrite

  2. 重新启动 apache 服务器。

    service apache2 restart

问题 2

  1. 除上述内容外,您可能还必须从 apache conf 文件(apache2.conf、http.conf 或 000-default 文件)更改覆盖规则。

  2. 找到“目录 /var/www/”

  3. 将“覆盖无”更改为“覆盖全部”

问题 3

如果您收到错误,指出找不到重写模块,则可能是您的 userdir 模块 未启用。因此,您需要启用它。

  1. 在控制台中键入以下内容:

    sudo a2enmod userdir

  2. 如果仍未启用,请尝试启用重写模块(如上所述)。

要进一步阅读,您可以访问以下网站:http://seventhsoulmountain.blogspot.com/2014/02/wordpress-permalink-ubuntu-problem-solutions.html

评论

2赞 Banago 4/6/2014
问题的伟大分解。
0赞 Marki555 6/18/2015
不要使用,因为它会启用太多的危险功能(例如使用 perl 脚本)。请改用AllowOverride AllAllowOveride Options
33赞 Umesh Patil 7/4/2014 #10

打开终端并输入,它将为您的模块启用Apache。a2enmod rewritemod_rewrite

然后转到并编辑默认文件。(为此,您必须对此文件和 sites-available 文件夹具有可写权限。/etc/apache2/sites-available

将下面的第 4 行替换为现有的第 4 行至第 14 行

DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

现在重新启动你的 apache 或/etc/init.d/apache2 restartservice apache2 restart

再次进行干净的 URL 测试,这次将通过。

8赞 Manoj Rammoorthy 10/12/2014 #11

我刚刚做到了这一点

sudo a2enmod rewrite

然后,您必须通过以下命令重新启动 Apache 服务

sudo service apache2 restart
4赞 Garrett Ellis 4/29/2015 #12

当我第一次为忽略我的流量mod_rewrite规则而苦苦挣扎时,我(令人沮丧地)了解到我把它们放在了错误的位置,这意味着无论它们写得多么好,我的流量都会忽略所有这些规则。确保这种情况不会发生在您身上:<VirtualHost>

# Change the log location to suit your system. RewriteLog /var/log/apache-rw.log RewriteLogLevel 2

如果您正常重启 Apache,这些参数将激活,因此您可以回收它们并密切监视mod_rewrite行为。问题解决后,将 RewriteLogLevel 调低并庆祝。

在我 100% 的经验中,我发现 RewriteLog 帮助我发现了我的重写规则的问题。我不能推荐这个。祝您在故障排除中好运!

另外,这个书签是你最好的朋友:http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog

评论

0赞 There 11/23/2023
此功能已被删除,在 2.4 (httpd.apache.org/docs/2.4/mod/mod_rewrite.html 中不再可用)
57赞 Ijas Ahamed N 6/18/2015 #13

新的 apache 版本在某种程度上发生了变化。如果你的apache版本是2.4,那么你必须去。将有一个名为 的文件。您必须编辑该页面(您应该具有root权限)。像这样更改目录文本/etc/apache2/apache2.conf

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

现在重新启动 apache。

service apache2 reload

希望它有效。

评论

2赞 paulc 7/31/2018
这是最新的答案。
3赞 Luiz Cavalcanti 2/14/2019
如果您在 2019 年及以后,请为这个答案投赞成票:)
0赞 Woody 4/23/2021
是的,先生,这帮助我摆脱了困境!最简单的答案。
7赞 Abhishek Gurjar 3/27/2017 #14

旧线程,只想把不将 AllowOverride 设置为 all 而是使用您要使用的特定 mod,

AllowOverride mod_rewrite mod_mime

并且此行应该不加注释

LoadModule rewrite_module modules/mod_rewrite.so

参考资料

10赞 prasoon 9/12/2018 #15

使用以下命令

sudo a2enmod rewrite

并通过以下命令重新启动apache

sudo service apache2 restart