我目前在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>
现在可以使用了。
答案 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>
容器的想法。