Htaccess - 将目录映射到url并隐藏目录名称

时间:2013-09-12 12:22:13

标签: php .htaccess

我有一个具有此目录结构的简单本地站点:

/
    test2/
        .htaccess
        bootstrap.php
        git-service/
            bootstrap.php

我想要完成的是当用户请求www.example.com/test2/git/时,他获取git-service目录的内容,而如果他试图直接请求目录git-service( www.example.com/test2/git-service/),此请求被视为正常请求(例如,作为主test2 / bootstrap.php的GET值)。

我现在所做的是:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /test2

RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteCond %{REQUEST_URI} ^/test2/git($|/.*$)
RewriteRule . /test2/git-service/bootstrap.php?request=GIT [L]

RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteCond %{REQUEST_URI} ^/test2/git-service($|/.*$)
RewriteRule . /test2/bootstrap.php [L]

问题是/ test2 / git和/ test2 / git-service请求都传递给主bootstrap.php文件(test2 / bootstrap.php)。如果我注释掉第二个块(处理git-service请求的块),行为是正确的,这意味着test2 / git请求被正确传递给git-service / bootstrap.php文件。但是当我激活第二部分时,与之前相同的test2 / git /请求现在传递给主test2 / bootstrap.php文件。

作为一方而不是,所有这一切背后的原因是我试图将目录的实际名称与获取它及其内容的请求分离。

非常感谢你。

==== EDIT ====

非常感谢,anubhava,你的建议非常有效,虽然需要进行一些细微的改动,因为服务器在请求git / pages时仍然给我404错误(git-service页面被正确映射)。

对我有用的代码是:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /test2/

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
#RewriteRule ^git(/.*|)$ git-service/bootstrap.php?request=GIT [L,NC]
RewriteCond %{REQUEST_URI} ^/test2/git(|/.*)$
RewriteRule . /test2/git_service/bootstrap.php?request=GIT [L]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^git-service(|/.*)$ bootstrap.php [L,NC]

出于某种原因,我无法移除第二条RewriteCond线,并且我无法用实际条件替换第一个RewriteRule中的全匹配点,或者我得到404错误。

1 个答案:

答案 0 :(得分:2)

让您的代码如下:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /test2/

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^git(/.*|)$ git-service/bootstrap.php?request=GIT [L,NC]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^git-service(/.*|)$ bootstrap.php [L,NC]