【问题标题】:Mod rewrite - remap site rootMod rewrite - 重新映射站点根目录
【发布时间】:2012-04-03 11:17:30
【问题描述】:

我在以下配置(简化版)中的 mod rewrite 遇到了一些问题:

/index.php
/public/
/public/file.txt

我需要将站点根目录重新映射到 /public,这样我就可以为 /public 中的每个现有文件调用 /file.txt。同时,每个不存在的文件都应该重新映射到不在 /public 文件夹中的 index.php。

我之前已经通过以下方法解决了这个问题:

RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -f
RewriteRule ^(.*)$ public/$1 [L]

RewriteRule ^(.*)$ index.php?$1 [L]

唯一的问题是它仅在站点和 .htaccess 位于服务器根目录中时才有效。如果站点位于 /codeigniter/ 目录中,我需要让它工作

/codeigniter/index.php
/codeigniter/public/
/codeigniter/public/file.txt

这显然失败了,因为

/public%{REQUEST_URI}

翻译成

/public/codeigniter/public/ which doesn't exist

我已尝试将 rewriteBase 设置为 /codeigniter/ 目录,但我认为它只会删除 rewrite Rule 中的 dir 而不是 RewriteCond 中的目录,因为它不起作用。

我认为一个想法是将所有内容映射到 /public 文件夹并在 /public/.htacces 中将不存在的文件重新映射到 ../index.php(不确定是否可能)

我真的很感激您在这方面能给我的任何帮助,因为这是我经常面临的一个老问题。 理想情况下,路径不应在 .htaccess 中硬编码,因此我可以轻松移动或重命名站点文件夹,而无需更改 .htaccess

干杯

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    经过几个小时的努力,我终于找到了答案:

    在 /codeigniter/.htacces 我们需要这些行:

    RewriteEngine On
    
    RewriteRule    ^$ public/
    RewriteRule    (.*) public/$1
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule    (.*) index.php?$1 [L]
    

    我们需要在 /codeigniter/public 中添加第二个“几乎为空”的 .htaccess,只需一行:

    RewriteEngine On
    

    现在我的站点根目录受到远程访问的保护,并且我的公用文件夹的名称从链接中隐藏。此外,我可以随意重命名或移动我的 /codeigniter 文件夹,而无需在 .htaccess 中进行任何修改

    祝大家天天快乐

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 1970-01-01
      • 2016-10-19
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多