如何使用.htaccess

时间:2015-09-23 12:00:00

标签: apache .htaccess mod-rewrite redirect

我有一个域名和托管,允许我使用cPanel拥有尽可能多的子域名。 我创建了一个名为projects.test.com的程序,我在其中上传了所有项目。

projects.test.com指向此特定路径:public_html/projects

现在,我的主域test.com使用301重定向指向此路径:public_html/home

实际上这个位正常,就像我输入test.com一样,我会被重定向到test.com/home

现在,我已经写了一个关于如何从网址中删除/home的问题(here),但我确实这样做了。我唯一能解决的问题是,出于某种原因添加了

RewriteEngine on
RewriteBase /

RewriteRule ^$ home/ [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^((?!home/).+)$ home/$1 [L,NC]

在我的根.htaccess上,它会破坏子域projects.test.com

所以我的问题是,我怎样才能改变它,使其仅适用于主域而不破坏我目前拥有的这个子域以及我将来可以创建的其他域?

另外,我是否需要编辑根目录(用作public_html文件夹,或public_html以上的一个文件夹? 对不起,我是所有这类服务器配置的新手,我还在努力学习。

感谢您的任何建议

修改

root中的.htaccess文件是:

<IfModule mod_deflate.c>
    SetOutputFilter DEFLATE
    <IfModule mod_setenvif.c>
        # Netscape 4.x has some problems...
        BrowserMatch ^Mozilla/4 gzip-only-text/html

        # Netscape 4.06-4.08 have some more problems
        BrowserMatch ^Mozilla/4\.0[678] no-gzip

        # MSIE masquerades as Netscape, but it is fine
        # BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

        # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
        # the above regex won't work. You can use the following
        # workaround to get the desired effect:
        BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

        # Don't compress images
        SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
    </IfModule>

    <IfModule mod_headers.c>
        # Make sure proxies don't deliver the wrong content
        Header append Vary User-Agent env=!dont-vary
    </IfModule>
</IfModule>

public_html文件夹中的那个是:

RewriteOptions inherit

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_URI} !^/home
RewriteRule ^/(.*)$ /home$1 [L]

RewriteCond %{HTTP_HOST} ^test\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.test\.com$
RewriteRule ^/?$ "http\:\/\/www\.test\.com\/home" [R=301,L]

1 个答案:

答案 0 :(得分:2)

cPanel允许您在public_html目录之外(或上方)放置插件或子域。由于您已经创建了子域名,请登录cPanel并单击子域名链接。在修改子域部分中,您可以编辑文档根目录。您需要这样做并将路径设置为以下内容:

domains/projects.test.com

执行此操作会将所有插件和子域组织在public_html目录之外的单个文件夹中,并避免出现很多麻烦。下次创建插件或子域时,您将执行相同操作并将文档根设置为domains/sub.test.com

这些插件和子域的绝对路径与此类似(除了用户名和可能的home目录的名称):

/home/<your_username>/domains/projects.test.com/

当然,您的主域名(与您的帐户相关联的域名)将始终指向此处:

/home/<your_username>/public_html/

解决了该问题后,如果您希望将所有请求发送到home希望它显示在网址中,那么您的.htaccess文件(在您的public_html目录中)应如下所示:

<IfModule mod_dir.c>
    DirectoryIndex index.php index.html
</IfModule>

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript

    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

    <IfModule mod_setenvif.c>
        SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
    </IfModule>

    <IfModule mod_headers.c>
        Header append Vary User-Agent env=!dont-vary
    </IfModule>
</IfModule>

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options +FollowSymLinks -MultiViews
    </IfModule>

    RewriteEngine On

    RewriteBase /

    RewriteCond %{REQUEST_METHOD} ^TRAC[EK]
    RewriteRule .* - [L,R=405]

    RewriteCond %{HTTP_HOST} ^test\.com$ [NC]
    RewriteRule ^/?$ http://www.test.com [R=301,L]

    RewriteCond %{HTTP_HOST} ^www\.test\.com$ [NC]
    RewriteCond %{REQUEST_URI} !^/home/
    RewriteRule ^(.*)$ /home/$1 [L]
</IfModule>

你还提到你的.htaccess目录中有一个root文件,我猜你的意思是:

/home/<your_username>/.htaccess

Apache(或主机运行的任何HTTP服务器)将读取该文件。只读取public_html目录(或其他文档根目录)中的文件。