使用mod_rewrite(htaccess)将子文件夹重定向到主域(root)

时间:2016-12-04 05:41:43

标签: apache .htaccess mod-rewrite server request

所以我从另一个人那里购买了一个脚本(没什么好看的,让我们说只是一个自定义的CMS)这有点复杂并且使用了我不知道的框架,除了“bootstrap”,“laravel”这样的名字等等。我是知道基础的人,从中间层面知道一些事情,但又一次,只有当我看到一些奇特的解决方案时,我才会感到困惑。

就像这里 - 我从未见过基于奇怪扩展名的文件构建的页面和两个 .htaccess文件 - 一个在root中,另一个在/ public /文件夹中。尽管如此,即使文件太多,一切都运行得非常好而且速度很快。

以下是问题的描述:

因此,当浏览器加载页面(domain.com)时,它会从/ public /文件夹请求(我猜)内容,一切正常,域仍然是domain.com。问题是,domain.com/public也可以工作,我想在这个特定的地址上创建重定向,只是为了防止索引这个看起来很糟糕的domain.com/public地址,但请记住,domain.com应该还能正常工作

我在SO和其他页面上尝试过maaany解决方案,但它们导致页面崩溃(内部服务器错误)或者根本没有做任何事情。我认为其中一些可能有效,但只有当文件没有嵌入另一个子文件夹时。呃我不知道,我没有想法。你能帮我吗?

这是root的.httaccess

RewriteEngine On

RewriteCond %{THE_REQUEST} /public/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]

RewriteRule ^((?!public/).*)$ public/$1 [L,NC]

这是public / .htaccess

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

RewriteEngine On

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>

1 个答案:

答案 0 :(得分:0)

在我看来,你应该有什么工作,特别是根.htaccess中的第一个条件+规则是为了做你所要求的。我会稍微打磨一下:

/.htaccess

RewriteEngine On
RewriteBase /
# Fix URLs that begin with "public" subdirectory
RewriteCond %{THE_REQUEST} \s/public(?:/(\S*))?\s
RewriteRule ^ %1 [NS,NE,R=301,END]
# Internally rewrite everything else
RewriteRule ^(?!public/).* public/$0 [DPI,L]

/public/.htaccess

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

    RewriteEngine On
    # Pretend this is the root
    RewriteBase /
    # Redirect trailing slashes if not a folder
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ $1 [DPI,R=301,END]
    # Handle front controller
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(?!index\.php$). index.php [DPI,END]
</IfModule>

如果您的Apache版本较旧,您可以使用L代替END,因为500错误,您就会知道。