如何为Apache 2.2启用mod_rewrite

Jak*_*old 460 apache mod-rewrite

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

我没有注释

LoadModule rewrite_module modules/mod_rewrite.s
Run Code Online (Sandbox Code Playgroud)

但是我的重写规则都没有,即使是简单的重写规则

RewriteRule not_found %{DOCUMENT_ROOT}/index.php?page=404
Run Code Online (Sandbox Code Playgroud)

我正在使用的所有规则都在处理我的托管,所以它们应该没问题,所以我的问题是,apache配置中是否有任何隐藏的东西,可以阻止mod重写?

Jon*_*hak 979

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

sudo a2enmod rewrite
Run Code Online (Sandbox Code Playgroud)

之后重启apache2

sudo /etc/init.d/apache2 restart
Run Code Online (Sandbox Code Playgroud)

要么

sudo service apache2 restart
Run Code Online (Sandbox Code Playgroud)

或者按照新的统一系统控制方式

sudo systemctl restart apache2
Run Code Online (Sandbox Code Playgroud)

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

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>
Run Code Online (Sandbox Code Playgroud)

上述.htaccess文件(如果放在您DocumentRootindex.php文件中)将所有流量重定向到文件,DocumentRoot除非该文件存在.

所以,假设您有以下目录结构,而httpdocs就是 DocumentRoot

httpdocs/
    .htaccess
    index.php
    images/
        hello.png
    js/
        jquery.js
    css/
        style.css
includes/
    app/
        app.php
Run Code Online (Sandbox Code Playgroud)

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

  • 进一步说明:您还需要确保您的站点的配置具有"AllowOverride All",以便完全读取`.htaccess`文件. (95认同)
  • a2enmod重写完成了这项工作 (17认同)
  • 这里的想法对于UNIX CLI是正确的,但这些命令仅适用于基于Debian的Linux发行版,而不适用于OP的Windows环境. (15认同)
  • CentOS,Fedora,RedHat没有这个命令 (12认同)
  • 如何在Windows中使用`a2enmod rewrite`? (3认同)
  • @Dennis你可以使用a2dismod重写 (2认同)
  • 如果您不需要允许任何其他覆盖,请在站点配置中使用"AllowOverride FileInfo"而不是"All". (2认同)

小智 224

对于我的情况,我有

RewriteEngine On
Run Code Online (Sandbox Code Playgroud)

在我的.htaccess,以及正在加载的模块,它无法正常工作.

我的问题的解决方案是将我的vhost条目编辑为inlcude

AllowOverride all
Run Code Online (Sandbox Code Playgroud)

在该<Directory>网站的部分中.

  • 实际上,即使在`.htaccess`中使用`a2enmod rewrite`和`RewriteEngine On` - VirtualHost文件中存在'AllowOverride all`也会阻止它工作 - 这就是让我失望的原因,将它改为`AllowOverride all `工作就像一个魅力:) (9认同)
  • 初学者在哪里..哪里是VirtualHost文件? (9认同)
  • 这是要走的路......除了这个,我还有其他一切. (3认同)
  • `AllowOverride`指令确定`.htaccess`文件中允许的指令类型".此外,"当此指令设置为`None`时,则完全忽略`.htaccess`文件.在这种情况下,服务器甚至不会尝试读取文件系统中的`.htaccess`文件." 官方文档:http://httpd.apache.org/docs/2.2/mod/core.html#allowoverride (2认同)

Jar*_*rod 80

我在一篇文章中写过这篇文章:http: //www.jarrodoberto.com/articles/2011/11/enabling-mod-rewrite-on-ubuntu

尝试设置:AllowOverride All.


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

  • 这将允许 .htaccess 覆盖任何其他 apache 配置。不建议这样做。 (2认同)
  • 是的:)这也是我的问题,但这里是你向像我这样的新手解释的地方,这个“AllowOverride All”位于 /etc/apache2/sites-available/[sitename].conf 和 [sitename-ssl] .conf。因为你,我不得不进行第二次研究:D,顺便说一句,谢谢! (2认同)

小智 74

如果不是上述工作尝试编辑/ etc/apache2/sites-enabled/000-default

几乎在顶部你会发现

<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
Run Code Online (Sandbox Code Playgroud)

更改AllowOverride NoneAllowOverride All

这对我有用

  • 我做了同样的事情,但添加了一个新部分“&lt;Directory /var/www/html&gt;”以仅应用此文件夹及以上文件夹中的规则。 (2认同)

nic*_*fly 43

在Ubuntu中:

跑:

a2enmod rewrite
Run Code Online (Sandbox Code Playgroud)

然后:

service apache2 restart
Run Code Online (Sandbox Code Playgroud)

mod_rewrite 现在将启用!


Kri*_*mar 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认同)

Ume*_*til 26

打开终端和打印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>
Run Code Online (Sandbox Code Playgroud)

现在用/etc/init.d/apache2 restart或重启你的apacheservice apache2 restart

再次进行干净的URL测试,这次它将被传递.


Ija*_*d N 24

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

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>
Run Code Online (Sandbox Code Playgroud)

现在重启apache.

service apache2 reload
Run Code Online (Sandbox Code Playgroud)

希望它有效.

  • 这是最新的答案。 (2认同)
  • 如果您在 2019 年及以后,请为这个答案点赞 :) (2认同)

Dan*_*son 15

<编辑>

刚刚注意到你说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
Run Code Online (Sandbox Code Playgroud)

没有注释:

LoadModule rewrite_module modules/mod_rewrite.so
Run Code Online (Sandbox Code Playgroud)

此外,如果要在默认情况下启用RewriteEngine,您可能希望添加类似的内容

<IfModule mod_rewrite>
    RewriteEngine On
</IfModule>
Run Code Online (Sandbox Code Playgroud)

到httpd.conf文件的末尾.

如果没有,请确保指定

RewriteEngine On
Run Code Online (Sandbox Code Playgroud)

你的.htaccess文件中的某个地方.


Abh*_*jar 6

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

AllowOverride mod_rewrite mod_mime
Run Code Online (Sandbox Code Playgroud)

这条线应该没有注释

LoadModule rewrite_module modules/mod_rewrite.so
Run Code Online (Sandbox Code Playgroud)

参考资料


小智 5

我只是这样做

sudo a2enmod rewrite
Run Code Online (Sandbox Code Playgroud)

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

sudo service apache2 restart
Run Code Online (Sandbox Code Playgroud)


pra*_*oon 5

使用下面的命令

sudo a2enmod rewrite
Run Code Online (Sandbox Code Playgroud)

并通过以下命令重启apache

sudo service apache2 restart
Run Code Online (Sandbox Code Playgroud)