我有一个像这样的网络目录结构:
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
...来表示多次) ,但我不知道如何将其应用于此解决方案。
非常感谢任何帮助。
答案 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){ ... })