如何为Apache 2.2启用mod_rewrite


474

我在Vista机器上重新安装了Apache 2.2,一切正常,除了mod重写。

我没有评论

LoadModule rewrite_module modules/mod_rewrite.s

但是我的重写规则都无效,即使是简单的规则

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

我正在使用的所有规则都可以在主机上使用,因此应该可以,所以我的问题是,apache配置中是否存在任何隐藏内容,可能会阻止mod重写?


1
实际的问题是我的路径错误,因为$ {DOCUMENT_ROOT}将我指向可以托管的根目录,但是在本地却出错,因此问题不只是RewriteEngine On,我已经拥有了..
Jakub Arnold

您可以将接受的答案更改为这个答案吗?当前接受的答案的作者承认这还不够好。
暗影巫师为您耳边

1
如何在Ubuntu 12.04 LTS中启用mod_rewrite(也应在Debian中工作)。这显示了安装和激活,下面的教程令人惊讶地没有做:(
Sliq 2014年

3
我强烈建议每个想要启用.htacces文件中的mod_rewrite指令的用户使用,AllowOverride FileInfo而不是允许所有内容使用,如本页上的所有答案所示。遗憾地看到所有这些答案把为长-AS-IT-作品-in在没事的方法,而不是试图理解所提出的“解决方案”的后果。尝试了解您在服务器上正在做什么以及如何限制刚刚放弃的特权AllowOverride AllRTFM!,在这个问题上是不明确的。
RemyNL '16

1
@Black在名为httpd.conf的Apache配置文件中。在我的PC中,它位于目录C:\ xampp \ apache \ conf中,因为我用XAMPP安装了Apache。
Lex Soft

Answers:


1005

为了使用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>

除非文件存在,否则以上.htaccess文件(如果放置在中DocumentRoot)会将所有流量重定向到中的index.php文件DocumentRoot

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

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

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


15
这里的想法对于UNIX CLI是正确的,但是命令仅适用于基于Debian的Linux发行版,不适用于OP的Windows环境。
詹森·里卡德

17
a2enmod重写完成了这项工作
Casper Black博士

98
进一步说明:您还需要确保您的站点配置正确AllowOverride All,以便.htaccess完全读取文件。
亚当·罗森菲尔德

2
@Dennis,您可以使用a2dismod重写
Jonathan Mayhak 2014年

3
如何a2enmod rewrite在Windows中使用?
纳曼

229

对于我的情况,我有

RewriteEngine On

在我的.htaccess,以及正在加载的模块中,它没有工作。

解决我的问题的方法是将我的虚拟主机条目编辑为inlcude

AllowOverride all

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


10
确实,即使使用a2enmod rewriteRewriteEngine On.htaccess- AllowOverride allVirtualHost文件中的存在也会阻止其运行-这就是吸引我的原因,将其更改为AllowOverride all具有魅力的样子:)
HeavenCore 2013年

9
这里的初学者.. VirtualHost文件在哪里?
davneet

3
这是要走的路...除此之外,我还有其他设置。
arrayown

2
AllowOverride指令确定“ .htaccess文件中允许的指令类型”。此外,“当此指令设置为时None.htaccess文件将被完全忽略。在这种情况下,服务器甚至不会尝试读取.htaccess文件系统中的文件。” 官方文档:httpd.apache.org/docs/2.2/mod/core.html#allowoverride
约翰ERCK

这为我解决了这一问题-我遇到了WordPress漂亮的永久链接无法正常工作的问题。如果您这样做a2enmod rewrite,然后在VirtualHosts文件中将“ AllowOverride None”更改为“ AllowOverride All”,则它应该可以工作。如果您在同一服务器(和IP地址)上运行多个域名,则VirtualHosts文件适用。您将对其进行设置以设置域。
杰森·普雷斯顿2014年

83

尝试设置:AllowOverride All


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


这应该是#1答案,因为它可以解决默认ubuntu安装中发生的问题!
2013年

1
这将允许.htaccess覆盖任何其他Apache配置。不建议这样做。
Bhargav Nanekalva 2014年

是的:)这也是我的问题,但是这里是您为像我这样的菜鸟解释的​​地方,“ AllowOverride All”位于/etc/apache2/sites-available/[sitename].conf和[sitename-ssl]中.conf。因为您,我不得不进行第二次研究:D,谢谢!
MetaTron

77

如果以上方法均无效,请尝试编辑/ 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

这对我有用


错误已从更改/laravel/public/authors was not found on this server/index.php was not found on this server
Gangaraju

找不到<目录>,只有<VirtualHost *:80>
Nicolas S.Xu

1
@ NicolasS.Xu将此文件放在<VirtualHost *:80>标记中
wimdetr

我做了同样的事情,但是增加了一个新的部分<Directory /var/www/html>来应用此文件夹中的规则。
Louis Loudog Trottier

44

在Ubuntu中:

跑:

a2enmod rewrite

然后:

service apache2 restart

mod_rewrite 现在将启用!


28

如果您知道问题的根源,可以采用多种方法来解决此问题。

问题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

不要使用AllowOverride All它,因为它会启用太多的angerousours功能(例如使用perl脚本)。AllowOveride Options
改为

28

新的Apache版本已在某些方面进行了更改。如果您的Apache版本是2.4,则必须转到/etc/apache2/。将有一个名为的文件apache2.conf。您必须编辑那个(您应该具有root权限)。像这样更改目录文本

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

现在重新启动apache。

service apache2 reload

希望它能工作。


这是最新的答案。
paulc

1
如果您在2019年及以后,请投票给这个答案:)
Luiz Cavalcanti

27

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

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

在下面替换为现有的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>

现在,通过/etc/init.d/apache2 restart或重新启动您的Apacheservice apache2 restart

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


15

<编辑>

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

</ edit>

我更习惯在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文件中的某个位置。


@gabehabe,您的头像只是看起来像是拿着我的文档的图标,哈哈
Jonathan dos Santos

5

我只是这样做

sudo a2enmod rewrite

那么您必须通过以下命令重新启动apache服务

sudo service apache2 restart


4

使用以下命令

sudo a2enmod rewrite

并通过以下命令重启apache

sudo service apache2 restart

3

显然有多种方法可以实现,但是我建议使用更标准的方法:

ErrorDocument 404 /index.php?page=404

3

第一次使用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


2

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

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

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

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.