子目录上的虚拟主机

d.r*_*aev 3 virtualhost apache-2.2

我正在处理一个 Web 项目,并且要求它在顶级域以及像这样的域+目录路径上运行良好:

www.myDomain.com
www.myDomain.com/somedir/myproject/
Run Code Online (Sandbox Code Playgroud)

该项目很好地处理包含文件,

但是我没有设置我的 VHosts 来测试第二种情况 www.myDomain.com/somedir/myproject/

我目前的设置尽可能简单:

主机

127.0.0.1       www.myDomain.com
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

.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]
Run Code Online (Sandbox Code Playgroud)

我可以只使用虚拟主机吗?在本地机器上实现此设置的最佳实践是什么?

Kri*_*ien 7

您需要的是别名,而不是虚拟主机。虚拟主机使用主机名,而不是主机名 + 目录。

<VirtualHost *:80>
  DocumentRoot "C:\Projects\MyProject\public_html"
  ServerName  "www.myDomain.com"

  Alias /somedir/myproject  "C:\Projects\MyProject\public_html"
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

编辑:

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>
Run Code Online (Sandbox Code Playgroud)

将规则放在 .htaccess 文件中的优势在于,每个请求都会读取 .htaccess 文件。所以最好什么都不要。您可以将 RewriteRule 移出其目录上下文(以避免在每个匹配项上进行内部重定向)但是随后您必须修改模式,因为在服务器上下文中,它是您要匹配的整个 URL,而不仅仅是部分目录之后。