子目录URL重写PHP

时间:2013-07-03 15:18:42

标签: .htaccess mod-rewrite

设置

我的文件结构设置如下:

/root
   | 
   /api
      | 
      /Slim PHP framework
      index.php
   | 
   index.php

Slim目录中的index.php包含从JSON数据库中检索Mongo数据所需的路由。 E.g。

$app->get('/users(/:id)', function($id = null) use ($app, $collection) {
     /* Do mongo search and echo json_encoded data back */
});

我有一个.htaccess文件包含:从根目录下的文件中删除.php扩展名。

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php`

问题

我可以使用网址JSON访问我的http://localhost:8888/root/api/index.php/users数据。 但是,我想要做的是使用网址http://localhost:8888/root/api/users

访问数据

3 个答案:

答案 0 :(得分:3)

如果我理解正确,那该怎么办?

RewriteRule ^api/users/(.*)$ /root/api/index.php/users/$1 [L]
RewriteRule ^api/users$ /root/api/index.php/users [L]

应该允许此网址。

http://localhost:8888/api/users/1

它也允许这样做

http://localhost:8888/api/users

编辑:

这应该允许您在用户之后添加一个数字。还缩短了URL,因此您也不必在URL中包含root。

答案 1 :(得分:1)

假设您的.htacces位于网站根目录“/”

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

RewriteCond %{REQUEST_URI} !/index.php [NC]
RewriteRule ^(.*?/api)/(.*)$ $1/index.php/$2 [NC,L]

这将重定向

http://localhost/root/api/users/1 => http://localhost/root/api/index.php/users/1
http://localhost/root/api/data/20 => http://localhost/root/api/index.php/data/20

答案 2 :(得分:0)

需要注意的是,规则序列也很重要,因此如果您需要重写/重定向http://example.com/users AND http://example.com/users/http://example.com/userinfo/,同时重写{{3到http://example.com/users/uname然后这个应该工作:RewriteEngine on

RewriteEngine on 
RewriteRule ^users/$ /userinfo/ [L]
RewriteRule ^users/(.*)$ /scripts/script.php?id=$1 [L]
RewriteRule ^users$ /userinfo/ [L]

可能有一个更好的解决方案,少一行,但这个适合我。