如何使用.htaccess而不是VHost将文档根设置为子目录

vkc1a9a2  于 2022-11-16  发布在  其他
关注(0)|答案(4)|浏览(193)

在我的本地计算机上,以下代码运行良好:

<VirtualHost *:80>
       ##ServerAdmin postmaster@dummy-host2.localhost
       DocumentRoot "C:/xampp/htdocs/website_1"
       ServerName testpage.com/website_1
       ##ServerAlias www.recruitement.localhost
       ##ErrorLog "logs/dummy-host2.localhost-error.log"
       ##CustomLog "logs/dummy-host2.localhost-access.log" combined
 </VirtualHost>

然而,我托管我的网站托管公司称为justhost.com,他们不允许我修改httpd-vhosts.confhttpd.conf。现在我的整个网站的编码,使文件在website_1下引用其他文件在website_1下使用简单的斜线“/”意味着website_1被视为文档根。这在本地机器上工作得很好,但当上传到主机时,它给了我服务器错误,因为无法找到文件,因为它试图在public_html中找到这些文件
例如:

public_html
      - website_1
         - script.php
         - style.css

在我脚本.php中:

<a href="/style.css">See My Style</a>

这在本地计算机上运行良好,但在主机上失败,因为它尝试在public_html而不是public_html/website_1下查找style.css
有没有一种方法可以在不使用VHosts的情况下拥有多个文档根目录?比如使用.htaccess或其他方法。我想尽量避免重写代码,因为它大约有1万行代码。

s4n0splo

s4n0splo1#

通过httpd.conf启用mod_rewrite和.htaccess,然后将以下代码放在DOCUMENT_ROOT目录下的.htaccess中:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{DOCUMENT_ROOT}/website_1/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/website_1/$1 -d [OR]
RewriteCond %{DOCUMENT_ROOT}/website_1/$1 -l
RewriteRule (?!^website_1/)^(.*)$ /website_1/$1 [R=302,L,NC]

验证其工作正常后,将R=302替换为R=301。在测试mod_rewrite规则时,避免使用R=301(永久重定向)。

bq9c1y66

bq9c1y662#

在. htaccess中创建一个条目。假设您有一个网站abc.com。您希望在目录中运行另一个网站。然后在指向abc.com的父目录中创建一个.htaccess

RewriteEngine on

RewriteCond %{HTTP_HOST} ^abc.com$ [NC,OR]

RewriteCond %{HTTP_HOST} ^www.abc.com$ 

RewriteCond %{REQUEST_URI} !subdirectory/

RewriteRule (.*) /subdirectory/$1 [L]
gcuhipw9

gcuhipw93#

重写所有对根目录的图像请求可能是一个解决方案。您可以在根目录下的一个.htaccess文件中尝试此操作:

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /

# Check if request is for an image at root. Add/remove file types if necessary.
RewriteCond %{REQUEST_URI}  ^/([^.]+)\.(png|jpg|gif|css) [NC]
RewriteCond %{REQUEST_URI}  !/website_1  [NC]
# Rewrite request to point to "website_1" directory
RewriteRule .*               /website_1/%1.%2          [L,NC]
lp0sw83n

lp0sw83n4#

这个问题可能老了,但我已经尝试和这个代码的作品:

<IfModule mod_rewrite.c>

    # Environment Variables

    ## For example a laravel app
    ## Document : D:/xampp/htdocs/web/app/laravel/.htaccess
    ## Path     : D:/xampp/htdocs/web/app/laravel/public/index.php
    ## URI      :                /web/app/laravel/public/index.php
    ## root_path   = web/app/laravel
    ## public_path = public
    ## app_file    = index.php

    SetEnvIf Request_URI ^.* root_path=web/app/laravel
    SetEnvIf Request_URI ^.* public_path=public
    SetEnvIf Request_URI ^.* app_file=index.php

    # Make folder to be not indexable
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Protect hidden files
    RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC]
    RewriteCond %{SCRIPT_FILENAME} -d [OR]
    RewriteCond %{SCRIPT_FILENAME} -f
    RewriteRule "(^|/)\." - [F]

    DirectoryIndex %{ENV:app_file}

    # Serve Public Files
    RewriteCond %{DOCUMENT_ROOT}/%{ENV:root_path}/%{ENV:public_path}/$0 -d [OR]
    RewriteCond %{DOCUMENT_ROOT}/%{ENV:root_path}/%{ENV:public_path}/$0 -f
    RewriteRule ^.* %{ENV:public_path}/$0 [END]

    # Reroutes to app preprocessor (like index.php or index.html)
    RewriteCond %{DOCUMENT_ROOT}/%{ENV:root_path}/%{ENV:public_path}/$0 !-d
    RewriteCond %{DOCUMENT_ROOT}/%{ENV:root_path}/%{ENV:public_path}/$0 !-f
    RewriteRule ^.* %{ENV:public_path}/%{ENV:app_file} [END]

</IfModule>

你可能喜欢阅读文档,这里所有的资源我用:

您可能还希望在LogLevel Debug中查看error.log,以便在脚本不工作的情况下查看脚本的错误。

相关问题