mod_rewrite替换Slim Framework的%{REQUEST_URI}的开头

时间:2013-10-03 03:09:14

标签: php apache .htaccess mod-rewrite slim

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

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

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

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

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

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

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目录中的/myplugin Slim Framework应用程序实际处理。重要的是,明显的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>

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

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

尝试:

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

答案 1 :(得分:0)

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

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

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

...以及此路线规范:

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

因此,在向GET发出/somedir/info请求时,Slim从/somedir剥离REQUEST_URI并将$env['PATH_INFO']设置为值/info(这是实际上是在\ Slim \ Environment类的构造函数中完成的。

稍后,Router类将匹配/info并执行闭包功能。

如果你想通过url传递参数,那么路线就是:

$app->get('/info/:param', function($param) use ($app){ ... })