主办方

主办方

我正在从事一个 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,而不仅仅是目录之后的部分。

相关内容