【问题标题】:Redirect HTML "/" to subfolder of WWW directory, the VirtualHost DocumentRoot将 HTML "/" 重定向到 WWW 目录的子文件夹,即 VirtualHost DocumentRoot
【发布时间】:2015-12-26 01:04:45
【问题描述】:

很抱歉再次问这个问题。尽管已经对此进行了很多询问和讨论,但我似乎无法为使用 VirtualHost 的本地开发环境找到正确的解决方案。我正在使用 XAMPP Portable for Windows 进行开发工作,但假设对于 .htaccess 文件的任何其他本地服务器而言,这都是相同的。

例如,VirtualHost 的 DocumentRoot 为D:\dev\www\

例如,ServerName 是 devwork.webdev

HOSTS 条目是127.0.0.1 devwork.webdev

VirtualHost 文件的默认 DocumentRoot 为 DocumentRoot "D:/xampp/htdocs"。它工作得很好。

每个项目都位于D:\dev\www\ 下的文件夹中,例如D:\dev\www\project01\D:\dev\www\project02\ 等等,并且在启用Options Indexes FollowSymLinks 的情况下转到devwork.webdev 时会在浏览器中很好地显示。 Apache 没有显示任何错误,访问日志文件也正常,一切正常。

现在在我的 HTML 中,当我使用 <a href="/" class="navbar-brand">Project 01</a> 时,单击链接确实会链接到 D:\dev\www\,显示我在该文件夹中拥有的所有项目。

相反,我希望链接到项目的根目录,即D:\dev\www\project01\ 或者更确切地说是http://devwork.webdev/project01/

我怎样才能让它工作?

我正在寻找一个解决方案,这样我就可以在本地进行开发工作,并且以后无需更改 HTML 将数据通过 FTP 传输到实时主机的根目录,这样就可以工作了。

我已阅读并尝试过以下内容:
http://coolestguidesontheplanet.com/redirecting-a-web-folder-directory-to-another-in-htaccess/
https://perishablepress.com/redirect-subdirectory-to-root-via-htaccess/.htaccess How to redirect root URL to subdirectory files, rewrite to clean URL AND not affect subdomains?
http://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess/
https://stackoverflow.com/a/990405/1010918
How to redirect /directory/index.html and /directory/index.php to /directory/
Redirecting /directory/index.html to /directory/

How to remove .html from URL

http://forums.modx.com/thread/77211/endless-friendly-url-redirect-from-subdomain-folder-location
最接近我认为我需要的东西,但我一定做错了,因为我总是到达 DocumentRoot 而不是项目保存在 DocumentRoot 下的文件夹。

感谢您的帮助。

【问题讨论】:

  • 为什么不直接将 DocumentRoot 设置为 D:\dev\www\project01
  • 另外,您似乎误解了 VirtualHost。 VirtualHost 适用于在一台机器上模拟多个不同主机的情况。例如。如果您为project01.devwork.webdev 创建一个VirtualHost 设置,将该主机名添加到etc/hosts,并将其DocumentRoot 设置为D:\dev\www\project01,则对http://project01.devwork.webdev/ 的所有请求都应打开project01(但不是项目列表)
  • 将尝试您的建议,尽管我没有为每个 VirtualHost/Project 设置子域(然后每次都将它们添加到 HOSTS 文件中)。我将它们全部保存在 VirtualHost DocumentRoot 下的文件夹中,如问题中所述。您会看到我的 DocumentRoot 是 D:\dev\www,每个项目都在 WWW 的子文件夹中。否则,每次我对项目进行快速测试时,我都必须设置一个 VirtualHost 并编辑 HOSTS 文件。只需在 VirtualHost DocumentRoot 中创建一个文件夹并通过 HTML 中的"/" 链接到该文件夹​​就是我所追求的。
  • 当然,您可以将其全部保存在单个主机上并仅访问子文件夹,但这样您就无法满足您不必更改 HTML 的要求:/ 可能只意味着一件事您的主机:D:\dev\www 或其他。
  • 所以如果我想在单个主机上,我将不得不写 index.html 而不是 /。这仍然是可以接受的和/或好的做法吗?在源代码中有index.html 而不是/?尝试编写尽可能简洁的 HTML,并能够快速将其放到实时服务器上,而无需更改所有指向项目文件夹根目录的链接。

标签: html apache .htaccess redirect virtualhost


【解决方案1】:

这似乎最接近:

  1. 为您要访问的每个项目添加 VirtualHost 定义。 (我是 不知道如何在 XAMPP for Windows 上执行此操作)。

    例如,project01.devwork.webdev...

  2. 将此 VirtualHost 的 DocumentRoot 设置为 D:\dev\www\project01...

  3. 将主机名添加到您的 /etc/hosts/ 文件中。

  4. 在浏览器中打开http://project01.devwork.webdev/

    您应该会在 D:\dev\www\project01 中看到应用程序,而所有 URL 将基于“/”。

在后台发生了什么:

当您在浏览器中打开 URL http://project01.devwork.webdev/ 时,它会(像往常一样)将其转换为 IP 地址,但随着请求,它还会发送带有输入主机名的 Host 标头:

GET / HTTP/1.1
Host: project01.devwork.webdev

根据 Host 字段,Apache 将决定它需要“假装”成为哪个 VirtualHost,并从相应的目录中提供文件。

但是,如果您需要对项目进行索引,则必须使用完整的 URL 手动创建它。

【讨论】:

  • 是否也可以在不为每个项目创建 VirtualHost 定义和子域的情况下完成所有这些操作,并且只需重定向到各自的项目文件夹?在完全不更改 HTML 的情况下轻松将整个文件夹上传到主机的实时服务器,有什么更好的方法?当我在项目上进行开发工作时,我可以在本地拥有 .htaccess 文件,完成后只需将包含数据的文件夹上传到主机的实时服务器 - 完成。每个项目过程的整个 VirtualHost(子域)是否能让我做到这一点?这是如何使用 DocRoot 的纯子文件夹完成的?
  • @lowtechsun 您不会重定向到文件夹,而是重定向到另一个 URL。由您决定如何设计 URL 及其指向的位置。想一想:你想让/ 表示project01,你不需要重定向;您可以简单地将全局 DocumentRoot 设置为 project01 并完成,但这样您将无法访问其他项目。服务器无法神奇地知道您要重定向的位置。如果您想保留对所有项目的访问权限,您必须在 URL 中包含项目特定的内容(在我的回答中,它是主机部分)。
  • 我明白了。是的有道理。您是否知道任何其他方法可以做到这一点,将项目文件夹保留在一个主机下并且仍然能够使用"/"?我看了很多地方,一无所获,我认为这是由于你解释的。如果您知道解决方法或其他解决方案,我会全力以赴。我想从长远来看,为每个项目设置一个新的 VirtualHost 需要更多的时间,但它比源代码中没有 "/" 要好得多。实际上什么更好?在 HTML 源代码中有 index.html"/"?为什么?
  • 忘记最后一部分。我明白其中的逻辑。请参阅我的编辑。谢谢您的帮助。我不仅以错误的方式思考 VirtualHost 并且现在从您那里学到了一些东西,而且我现在还能够在 HTML 中使用 "/" 并将其移动到实时服务器而不更改 HTML。两大步。感谢您的指导。非常感谢!
【解决方案2】:

使用给定逻辑的替代方法是简单地为D:dev\www\projectname 中的每个项目添加一个 VirtualHost,方法是为其提供其自己的域,而不是主机上的子域。

现在已经在编辑 httpd-vhosts.conf(使用 XAMP,此文件位于 InstallDir 中,然后位于 apache\conf\extra 中)时几乎没有什么区别,但理想情况下 它可以将本地 HTML 复制到实时服务器,而无需更改 HTML 可能

因此,在本地工作的开发人员应该牢记这一点。我一定会的!!感谢您的帮助和信息。

<VirtualHost *:80>
    DocumentRoot "D:/dev/www/newprojectname"
    ServerName newdomainname.webdev
    ServerAlias www.newdomainname.webdev

    ErrorLog "D:/dev/www/log/dev-apache.error.log"
    CustomLog "D:/dev/www/log/dev-apache.access.log" common   

    <Directory "D:/dev/www/newprojectname">

        AllowOverride All

        Options Indexes FollowSymLinks

        Require local
        # more detailed local
        # Require ip 192.168.188
        # or the IP from your local network

    </Directory>
</VirtualHost>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2021-04-23
    相关资源
    最近更新 更多