Php mod_rewrite替换Slim框架%{REQUEST_URI}的开头

Php mod_rewrite替换Slim框架%{REQUEST_URI}的开头,php,apache,.htaccess,mod-rewrite,slim,Php,Apache,.htaccess,Mod Rewrite,Slim,我有这样一个web目录结构: root /content /plugins /myplugin /Slim (folder containing Slim Framework) index.php /other_folder_1 /other_folder_2 .htaccess index.html 我感兴趣的是在我的.htaccess文件中指定什么

我有这样一个web目录结构:

root
    /content
        /plugins
            /myplugin
                /Slim (folder containing Slim Framework)
                index.php
    /other_folder_1
    /other_folder_2
    .htaccess
    index.html
我感兴趣的是在我的
.htaccess
文件中指定什么,以便引用服务器上实际不存在的目录,但实际上指向
/myplugin
目录中的Slim应用程序

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

1. http://example.com/nonexistent_dir 2. http://example.com/nonexistent_dir/info 3. http://example.com/nonexistent_dir/info/details 这将使用
/
路径将所有3个测试示例重定向到
。所以我的想法是,我应该在
不存在的\u dir
之后捕获所有内容,不管它是什么或什么,并以某种方式将其附加到重写规则的末尾。但我不明白怎么做

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

任何帮助都将不胜感激。

请尝试:

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


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

例如,让我们看一个
/sub/index.php
(Slim index file)和这个重写规则:

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从
request\u URI
中剥离
/somedir
,并设置
$env['PATH\u info']
/info>(这实际上是在\Slim\Environment类的构造函数中完成的)

稍后,Router类将匹配
/info
,并执行closure函数

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

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

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

例如,让我们看一个
/sub/index.php
(Slim index file)和这个重写规则:

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从
request\u URI
中剥离
/somedir
,并设置
$env['PATH\u info']
/info>(这实际上是在\Slim\Environment类的构造函数中完成的)

稍后,Router类将匹配
/info
,并执行closure函数

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

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

谢谢你,乔恩。我已经做出了改变并尝试过了。当我使用
http://example.com/nonexistent_dir
,我被派往
/
路线。具有附加路径信息的任何变体(例如,
http://nonexistent_dir/info
)返回未指定输入文件的
消息。我已经读了一些关于这方面的文章,但是我会尝试找到更多关于如何解决它的内容。我觉得这可能是apache配置问题。服务器正在共享主机环境中运行,因此我希望能够进行适当的更改。如果您或其他人有任何进一步的指导,我们将不胜感激。@DerekHauffe您知道它是否与路径信息(在PHP脚本之后有路径的能力)有关吗?打开了吗?我不确定,乔恩。我猜这是允许的,因为如果我输入
http://example.com/content/plugins/myplugin/index.php/info/details
在位置栏中,我获得了适当的行为,并正确处理了
/info/details
路线。所以我很有信心这与我的重写规则或服务器设置有关。[我刚刚注意到,在我对你建议的第一次回应中,我使用了
http://nonexistent_dir/info
作为一个失败的例子。这应该是
http://example.com/nonexistent_dir/info
作为正确的失败示例。]@DerekHauffe我不熟悉slim框架,但可能是它正在检查
$\u服务器['REQUEST\u URI']
以及路径信息,它看到
/nonexistent\u dir/something/foo
(即使在重写之后)并决定它不知道那是什么。谢谢你的帮助,Jon。我会调查一下,并搜索
未指定输入文件。
消息。谢谢,Jon。我已经做了更改并尝试过。当我使用
http://example.com/nonexistent_dir
,我被发送到
/
路线。任何变体w第i个附加路径信息(例如,
http://nonexistent_dir/info
)返回一个
未指定输入文件。
消息。我已经读了一些关于此的内容,但将尝试查找更多有关如何解决此问题的信息。我得到的印象可能是apache配置问题。服务器正在共享主机环境中运行,因此我希望能够进行适当的更改。是否有进一步的指导您或其他人可能会非常感激。@DerekHauffe您知道它是否与路径信息(在PHP脚本之后有一个路径的能力)有关吗打开了吗?我不确定,乔恩。我猜这是允许的,因为如果我输入
http://example.com/content/plugins/myplugin/index.php/info/details
在位置栏中,我得到了适当的行为,并且正确处理了
/info/details
路线。因此我很有信心这两者都与此有关我的重写规则或服务器设置。[我刚刚注意到,在我对您建议的第一次响应中,我使用了
http://nonexistent_dir/info
作为一个失败的例子。这应该是
http://example.com/nonexistent_dir/info
作为正确的失败示例。]@DerekHauffe我不熟悉slim框架,但它可能正在检查
$\u服务器['REQUEST\u URI']
以及路径信息,并且它看到
/nonexistent\u dir/so