动态<directory>不允许RewriteEngine

时间:2018-12-23 05:14:27

标签: apache .htaccess configuration

我目前在OS X 10.14上使用dnsmasq进行了可变的主机设置。我的基本文件夹是~/Sites。我可以有一个文件夹~/Sites/{whatever},可以通过http://{whatever}.test/加载它。我正在尝试对我的一个项目使用mod_rewrite,但是由于某些原因,不允许使用RewriteEngine。

我的httpd-vhosts.conf文件设置如下:

<VirtualHost *:80>
    VirtualDocumentRoot "/Users/{Username}/Sites/%1"
    ServerName sites.test
    ServerAlias *.test
    Options Indexes FollowSymLinks

    <Directory "/Users/{Username}/Sites/%1">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

和我的.htaccess文件类似:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^read$ read.php
RewriteRule ^read/$ read.php
RewriteRule ^read/([\w\s]+)$ read.php?s=$1
RewriteRule ^read/([\w\s]+)/$ read.php?s=$1
RewriteRule ^read/([\w\s]+)/(\d+) read.php?s=$1&p=$2

.htaccess文件中的内容没关系,只要存在RewriteEngine On就会出错。
在目录标签中使用%1时,出现以下错误:

/Users/{Username}/Sites/reader/.htaccess: RewriteEngine not allowed here

如果不对目录进行硬编码,我似乎无法找到解决方法,但这违反了变量主机设置的目的。

如果我对目录进行硬编码,则站点将按应有的方式工作-因此其他所有工作都将正常工作。


已解决

我设法弄清楚了。

在我的httpd.conf中,我有以下内容:

#<Directory />
#    AllowOverride none
#    Require all denied
#</Directory>

请注意将其注释掉。

我将其更改为此:

<Directory />
    AllowOverride All
    Require all granted
</Directory>

现在可以使用了。

1 个答案:

答案 0 :(得分:0)

<Directory "/Users/{Username}/Sites/%1">

%1在这里无效的语法。我认为您不必一定要具体,因为所访问的目录已经由(虚拟)文档根目录控制。因此,从理论上讲,您可以改用<DirectoryMatch>指令,并提供与适当的目录 pattern 相匹配的指令。

但是,AllowOverride容器中不允许<DirectoryMatch>指令,仅非正则表达式<Directory>容器中不允许,因此这将限制您执行以下操作:

<Directory "/Users/{Username}/Sites">
    AllowOverride All
</Directory>

<DirectoryMatch "^/Users/{Username}/Sites/[a-z]+">
    Require all granted
</DirectoryMatch>

[a-z]+将与“读者”匹配。

更新:

  

我将其更改为此:

<Directory />
    AllowOverride All
    Require all granted
</Directory>
     

现在可以使用了。

这将启用对整个服务器的访问-这是不可取的(并且出于安全性性能的考虑,Apache文档特别警告不要这样做。)

您应该尽可能地严格-如上所述(这是首先在vHost内部使用限制性<Directory>容器的想法。