.htaccess:RewriteEngine不允许在此处使用。

39

我将 .htaccess 上传到服务器后,收到了一个 Error 500 (Internal Server Error)

在错误日志中,我看到了以下错误:

.../.htaccess: RewriteEngine not allowed here

但是mod_rewrite.so 已启用。

那么,我需要做出什么改变吗?

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>

/etc/httpd/conf/httpd.conf 文件中吗?

或者可能是其他什么东西吗?.htaccess 文件应该没问题,因为在我的本地主机上它完美地工作。我只是不想搞砸任何东西。

这是我的 .htaccess 文件的一部分:

Options All -Indexes

Options +FollowSymLinks

RewriteEngine On

是的,这都与AllowOverride指令有关。不一定需要AllowOverride All..但至少需要AllowOverride FileInfo。详情请参见:http://httpd.apache.org/docs/current/mod/core.html#allowoverride - LazyOne
这就是错误日志显示的全部内容吗? - linuxeasy
@linuxeasy 是的。路径和 .htaccess:RewriteEngine 不允许在这里。就是这样。 - user317005
8个回答

61

.htaccess最少的配置让其生效:

AllowOverride FileInfo Options

允许所有配置也可以正常工作:

AllowOverride All

1
AllowOverride All 可以工作,但 AllowOverride FileInfo Options 不行,wp-includes/.htaccess: deny not allowed here。 - Sérgio
@Jacek Kaniuk 如何在1and1中允许htaccess - Ilyas karim
3
AllowOverride控制.htaccess文件中可以使用的指令类型。因此,AllowOverride FileInfo Options是否足够取决于您使用的指令。对于mod_rewrite,需要FileInfo,对于问题中的.htaccess文件,需要FileInfo Options。如果要在.htaccess中使用Deny,还需要包含Limit指令类型。但大多数人都选择使用All以便"易用性"。 - MrWhite
2
然而,与这个答案暗示的相反,您永远不应该在<Directory />容器中设置除AllowOverride None以外的任何内容(正如问题中所述) - 它是指服务器根目录 - Apache文档明确警告不要为此做出 "出于安全和性能原因"。 相反,应该为包含.htaccess文件的特定目录(例如DOCUMENT_ROOT,如@anubhava的答案中提到的)设置它。 - MrWhite

9

假设您的DOCUMENT_ROOT是/home/foo/web,那么在httpd.conf文件中配置如下:

<Directory "/home/foo/web">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

这应该能解决你遇到的“不允许使用RewriteEngine”错误。


4

这只是一个想法,它曾经发生在我身上,我浪费了很多时间来解决它。

如果您有一个目录,例如d:/web/my-sites/some-site/,并且您将.htaccess放在d:/web/my-sites/some-site/.htaccess(它应该在这里)。

如果在此目录之前有任何.htaccess文件,Apache会读取这些文件,并阻止整个路径的执行,导致内部服务器错误。

例如:您有d:/web/my-sites/.htaccess


1
我刚找到了一个解决方案,https://dev59.com/bI7da4cB1Zd3GeqP-To3 - benck
这仍然取决于您如何/在哪里设置AllowOverride(以及Apache 2.4+上的AllowOverrideList)。可能还取决于Apache版本,因为AllowOverride指令的默认值在Apache 2.2和2.4之间发生了变化。 - MrWhite

3
在httpd版本2.4(2.4.3和2.4.4)中,请查看/etc/httpd/conf.d/wordpress.conf。 有一个条目:
.... 在wordpress.conf中,将“AllowOverride Options”更改为“AllowOverride All”。 在更改httpd.conf之外,还要重新启动http服务器,才能使更改生效。

0
尝试修改位于Mac下的/etc/apache2/users/username.conf的username.conf文件。
<Directory "/Users/akyoo/Sites/">
   AllowOverride All
   Options Indexes MultiViews FollowSymLinks
   Require all granted
</Directory>

我的.htaccess文件看起来像这样

#Allow from all
Options +FollowSymLinks
RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

这对我来说很好用。 Ubuntu用户的解决方案


只是补充一下,只有在特定需要时才启用MultiViews。如果您正在使用像这个例子中的mod_rewrite,那么您可能不需要它-这可能会导致意外冲突。 - MrWhite

0

在检查 /var/log/apache2/error.log 日志后,我从 Google Cloud 实例中得到了这种类型的错误。

.htaccess: RewriteEngine 不允许在此处

为了摆脱上述错误和 500 内部服务器错误,请按照以下简单步骤操作:

sudo nano /etc/apache2/apache2.conf

然后添加这些代码片段

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

在您进行更改之后,请确保重新启动服务器:

sudo service apache2 restart

这对我来说很有效,可以解决在Google Cloud实例上托管的500内部服务器错误问题。


0
此外,请确保您正在编辑正确的配置文件。我曾在 /etc/apache2/users/USERNAME.conf 下创建了一个文件,但是却在编辑 /etc/apache2/httpd.conf 文件。
删除 USERNAME.conf 文件即可解决问题。

-4

你可以在你的 .htaccess 文件中使用类似这样的代码:

RewriteEngine on
RewriteCond $1 !^(index\.php|html|test)
RewriteRule ^(.*)$ /index.php/$1 [L]

这段代码的意思很简单,就是任何不指向 index.php、html 或 test 的内容都会被重定向到 index.php 页面!
希望这对你有所帮助!

哦,我想我会用那个,谢谢!但我认为这并没有解决 RewriteEngine 不被允许的问题。 - user317005

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接