我正在从事一个 Web 项目,要求它在顶级域以及域+目录路径上运行良好,如下所示:
www.myDomain.com
www.myDomain.com/somedir/myproject/
该项目很好地处理了包含文件,
但我无法设置 VHost 来测试第二种情况www.myDomain.com/somedir/myproject/
我当前的设置尽可能简单:
主办方
127.0.0.1 www.myDomain.com
httpd-vhosts.conf
NameVirtualHost *:80
<Directory C:/Projects>
Order Deny,Allow
Allow from all
</Directory>
<VirtualHost *:80>
DocumentRoot C:\wamp\www
ServerName localhost
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "C:\Projects\MyProject\public_html"
ServerName "www.myDomain.com"
</VirtualHost>
#@ToDo make this work ...
#<VirtualHost *:80>
# DocumentRoot "C:\Projects\MyProject\public_html"
# ServerName "www.myDomain.com/somedir/myproject/"
#</VirtualHost>
.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php [NC,L]
我可以仅使用虚拟主机来执行此操作吗?在本地机器上实现此设置的最佳实践是什么?
答案1
您需要的是别名,而不是虚拟主机。虚拟主机使用主机名,而不是主机名 + 目录。
<VirtualHost *:80>
DocumentRoot "C:\Projects\MyProject\public_html"
ServerName "www.myDomain.com"
Alias /somedir/myproject "C:\Projects\MyProject\public_html"
</VirtualHost>
编辑:
OP 的问题似乎有些不同,他的解决方案是使用 .htaccess 文件中的 RewriteRule 将所有非实际物理文件发送到 index.php。这可行,但将它们放入 httpd.conf(或包含的文件)中效率更高。
有一种方法可以轻松地将有效的 RewriteRules 从 .htaccess 移动到 httpd.conf 而无需更改它们:使用容器。
因此,如果您在 /var/www/myproject 中有一个 .htaccess,您可以像这样移动到 httpd.conf。
<Directory /var/www/myproject>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php [NC,L]
</directory>
与将规则放入 .htaccess 文件中相比,这样做的优点是每次请求都会读取 .htaccess 文件。所以最好不要有这样的文件。您可以将 RewriteRule 移出其目录上下文(以避免每次匹配时都有内部重定向),但这样就必须修改模式,因为在服务器上下文中,您要匹配的是整个 URL,而不仅仅是目录之后的部分。