.htaccess无法正常工作


135

我有一台在Linux ubuntu上运行的AWS EC2服务中的服务器,并且已经安装了apache,php和mysql。

.htaccess在文档根目录中添加了一个文件/var/www/html

我在其中输入了此代码: ErrorDocument 404 /var/www/html/404.php它仍然没有显示。

我多次输入此命令:sudo service httpd restart重新启动服务器,但未显示任何更改...

我该如何解决...我做错了什么吗?

提前致谢!


2
您确定要将400 Bad Request错误映射到/var/www/html/404.php吗?
林恩(Jon Lin)

Answers:


288

首先,请注意,.htaccess文件不需要重新启动httpd。.htaccess文件专门用于没有root权限的人-即,没有访问httpd服务器配置文件的权限,并且无法重新启动服务器。由于可以重新启动服务器,因此不需要.htaccess文件,可以直接使用主服务器配置。

其次,如果.htaccess文件被忽略,则需要检查以确保AllowOverride设置正确。有关详细信息,请参见http://httpd.apache.org/docs/2.4/mod/core.html#allowoverride。您还需要确保将其设置在正确的范围内,即在配置的正确块中。确保你不是编辑一个块中,例如。

第三,如果要确保实际上正在读取.htaccess文件,请在其中放入垃圾。当您将浏览器指向包含该文件的目录时,.htaccess文件中的无效行,例如“ INVALID LINE HERE”,将导致500服务器错误。如果不是,则您没有正确配置AllowOverride。


141
+1用于将垃圾放入.htaccess文件中作为诊断工具。
retrohacker 2014年

46
编程中的垃圾比听起来有用。
EnKrypt 2014年

1
"A STRING" 放入.htaccess文件,因此收到错误消息,因此我将AllowOverride All所有内容apache2.conf放入Debian,并且可以正常工作
Alex

1
请注意,AllowOverride仅在<Directory>指令中有效,如果放在<Location ...>节中,则将被忽略,请参阅: httpd.apache.org/docs/2.4/mod/core.html#allowoverride
Daniel Sokolowski

2
另请注意,该<Directory>指令期望使用绝对路径而不是相对路径。就我而言,<Directory /> 失败<Directory /var/www/html/subdir>工作。
Lukas Knuth

115
  1. 启用Apache mod_rewrite模块

    a2enmod rewrite

  2. 将以下代码添加到 /etc/apache2/sites-available/default

    AllowOverride All

  3. 重新启动Apache

    /etc/init.d/apache2 restart


7
请注意,在Apache 2.4中,/ etc / apache2 / sites-available下的配置文件现在必须以.conf结尾。而且我在服务器上有一些混合,在/ etc / apache2 / sites-available中有一个default.conf,在/ etc / apache2 /中有一个default.conf
rubo77

2
谢谢,在我的情况下,默认情况下在apache2中未启用重写功能
交叉

我已经执行了以下步骤,但是在Apache 2.4中却无法正常工作我在做什么错了= [
Luciano Andress Martini

看起来require ip覆盖要求认证,这种行为是意外的(apache 2.2中的某些ip不允许这样做),并且我认为这很危险,因为ip异常正在模拟认证,在apache 2.2中它们是完全不同的东西!
Luciano Andress Martini

我省略了第一步,但是在我的apache.conf(Debian 8,/ etc / apache2 / apache.conf)中确实将AllowOverride更改为All,重新启动并且文件不可访问,很好。但是错误不像权限被拒绝而是500 Internal Server Error,为什么?我可以解决吗?
dasLort

44

如果您已经尝试了以上所有方法,并且都是正确有效的答案,并且您的htaccess文件无法正常工作或无法读取,请更改apache2.conf文件中的指令。在Ubuntu下,路径为/etc/apache2/apache2.conf

更改<Directory>指向htaccess文件所在的公共网页的指令。从更改AllowOverride NoneAllowOverride All

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

我遇到了同样的问题,并在Ubuntu Ask!中找到了答案和解释!论坛/ubuntu/421233/enabling-htaccess-file-to-rewrite-path-not-working


2
或者,可以在VHost上添加它
ssi-

实际上,只AllowOverride FileInfo需要在第三行.htaccess中读取和使用文件即可。All还启用其他配置替代,例如.httpasswd(可以通过使用Authconfig代替单独启用All)。
拉法尔

20

对于Ubuntu,
首先运行以下命令:

sudo a2enmod rewrite

然后,/etc/apache2/sites-available/000-default.conf使用以下命令使用nano或vim 编辑文件:

sudo nano /etc/apache2/sites-available/000-default.conf

然后在000-default.conf文件中,将其添加到行之后DocumentRoot /var/www/html。如果您的html根目录是其他目录,请写下:-

<Directory "/var/www/html">
  AllowOverride All
</Directory>

完成所有操作后,使用以下命令重新启动apache sudo service apache2 restart


6

只需遵循3个步骤

  1. 使用以下命令启用mode_rewrite

    sudo a2enmod重写

将要求输入密码。所以输入你的密码

  1. 更新位于/ etc / apache2 / sites-available /目录中的000-default.confdefault.conf文件。您不能直接对其进行编辑。所以用下面的命令打开

    须藤gedit /etc/apache2/sites-available/000-default.conf

或者sudo gedit /etc/apache2/sites-available/default.conf

你会得到

DocumentRoot / var / www / html

要么

DocumentRoot / var / www

线。在其后添加以下代码。

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

使用户的目录标记路径与文件中显示的相同。

  1. 使用以下命令重启您的apache服务器

    sudo服务apache2重新启动


谢谢。来自巴西的问候。
Fox.19年

5

最有可能的是,AllowOverride设置为None。在/ etc / apache2文件夹中的apache2.conf的目录部分中

尝试将其设置为AllowOverride All


5

以我的经验,/ var / www /目录指令可防止子文件夹virtualhost指令。因此,如果您尝试了所有建议但仍然无法正常工作,并且您正在使用虚拟主机,请尝试此操作;

1-确保 AllowOverride All/etc/apache2/sites-available/example.com.conf

2-检查/ var / www /目录指令/etc/apache2/apache2.conf(可能在第164行),看起来像;

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

如果有AllowOverride None指令,请将其更改为 AllowOverride All 或仅转义行


3

默认情况下,Apache禁止使用.htaccess文件应用重写规则,因此

步骤1 —启用mod_rewrite(如果未启用) 首先,我们需要激活mod_rewrite。它可用,但未通过全新Apache 2安装启用。

$ sudo a2enmod rewrite

这将激活模块或警告您该模块已启用。要使这些更改生效,请重新启动Apache。

$ sudo systemctl restart apache2

现在已完全启用mod_rewrite。在下一步中,我们将设置一个.htaccess文件,该文件将用于定义重定向的重写规则。

步骤2 —设置.htaccess 使用nano或您喜欢的文本编辑器打开默认的Apache配置文件。

$ sudo nano /etc/apache2/sites-available/000-default.conf

在该文件中,您会发现从第一行开始的一个块。在该块内,添加以下新块,以便您的配置文件如下所示。确保所有块都正确缩进。

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    <Directory /var/www/html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    . . . 
</VirtualHost>

保存并关闭文件。要使这些更改生效,请重新启动Apache。

$ sudo systemctl restart apache2

做完了 您的.htacess应该可以工作。 该链接实际上可以帮助某人 https://www.digitalocean.com/community/tutorials/how-to-rewrite-urls-with-mod_rewrite-for-apache-on-ubuntu-16-04


对我$ sudo httpd -k restart有用的重新启动命令是(Red Hat 4.4.7-23)
Himalaya Garg,

3

我清除了此用法。通过使用此站点,请单击此处,按照以下步骤操作,直到ubuntu版本18.04为止,遵循相同的步骤。


1

WampServerOpen WampServer Tray图标中-> Apache ---> Apache模块---> rewrite_module



0

为了完整起见,如果“ AllowOverride All”不能解决您的问题,则可以使用以下方法调试此问题:

  1. 运行apachectl -S,看看您是否有多个namevhost。可能是httpd正在寻找另一个DocumentRoot的.htaccess。

  2. 使用strace -f apachectl -X并查找从何处加载(或不加载).htaccess。

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.