【问题标题】:Redirect subfolder to the main domain (root) using mod_rewrite (htaccess)使用 mod_rewrite (htaccess) 将子文件夹重定向到主域 (root)
【发布时间】:2017-04-18 18:09:02
【问题描述】:

所以我从另一个人那里买了一个脚本(没什么花哨的,让我们说只是一个定制的 CMS),它有点复杂,并且使用的框架除了“bootstrap”、“laravel”等名称外我一无所知.我是一个知道基础并且从中级水平知道一些东西的人,但同样,只有一些,所以当我看到一些花哨的解决方案时我会感到困惑。

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

这是问题的描述:

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

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

这是根目录的 .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>

【问题讨论】:

    标签: apache .htaccess mod-rewrite server request


    【解决方案1】:

    在我看来,您所拥有的应该可以工作,特别是根 .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 错误您会知道。

    【讨论】:

    • 感谢沃尔夫愿意提供帮助。但是你的代码没有做任何事情,domain.com/public 仍然加载并且没有重定向到 domain.com...你知道为什么吗?
    • 你还没有说是否有任何其他页面加载。如果您在根.htaccess 的开头放置一行无意义的随机文本会发生什么?如果您没有收到错误,那么您的规则可能根本没有被使用。
    猜你喜欢
    • 2012-01-09
    • 2017-03-05
    • 2015-05-09
    • 2013-11-08
    • 1970-01-01
    • 2012-11-23
    • 2022-01-17
    • 1970-01-01
    • 2013-03-26
    相关资源
    最近更新 更多