1

我有一个这样的网络目录结构:

root
    /content
        /plugins
            /myplugin
                /Slim (folder containing Slim Framework)
                index.php
    /other_folder_1
    /other_folder_2
    .htaccess
    index.html

我对在我的.htaccess文件中指定的内容感兴趣,以便引用服务器上实际不存在的目录,但实际上指向/myplugin目录中的 Slim 应用程序。

以下是一些示例 URL,我希望用户(或我自己)能够在浏览器的地址栏中使用它们,或者在文档中链接:

1. http://example.com/nonexistent_dir
2. http://example.com/nonexistent_dir/info
3. http://example.com/nonexistent_dir/info/details

我正在尝试将这些 URL 重写为以下内容:

1. http://example.com/content/plugins/myplugin/index.php
2. http://example.com/content/plugins/myplugin/index.php/info
3. http://example.com/content/plugins/myplugin/index.php/info/details

...实际上所有这些都将由目录index.php中的 Slim Framework 应用程序处理/myplugin。重要的是,明显的 URL 保持在第一个示例中的样子,而不会在地址栏中进行更改。

这是.htaccess根目录中文件当前的内容:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/schedule [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ /content/plugins/myplugin/index.php [QSA,NC,L]
</IfModule>

这会将所有 3 个测试示例重定向到http://example.com/nonexistent_dir,使用/路由。所以我的想法是我应该捕获 之后的所有内容nonexistent_dir,无论它是什么或什么都没有,并以某种方式将其附加到 RewriteRule 的末尾。但我不明白怎么做。

我意识到在表达式周围使用括号将使我能够将内容用作变量,用$1(或$2$3...表示倍数)引用它,但我不知道如何将其应用于此解决方案。

任何帮助将不胜感激。

4

2 回答 2

1

尝试:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^nonexistent_dir(/.*)?$ /content/plugins/myplugin/index.php$1 [L]
于 2013-10-03T04:29:23.320 回答
0

Slim 实际上丢弃了基本目录,并设置$env['PATH_INFO'],将此变量的内容与指定的路由匹配。

例如,让我们采用一个/sub/index.php(Slim 索引文件)和这个重写规则:

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

...以及此路线规范:

$app->route('/info', function() use ($app) { ... });

因此,通过对 的GET请求,Slim从值/somedir/info中剥离并设置值(这实际上是在 \Slim\Environment 类的构造函数中完成的)。/somedirREQUEST_URI$env['PATH_INFO']/info

稍后Router类会匹配/info并执行闭包函数。

如果您想通过 url 传递参数,则路由将是,例如:

$app->get('/info/:param', function($param) use ($app){ ... })
于 2014-05-14T14:19:54.710 回答