URL重写到另一个文件夹和文件以获取特定请求

时间:2014-03-16 11:35:06

标签: .htaccess mod-rewrite redirect url-rewriting apache2

我在本地LAMP上有以下目录结构:

  • WWW
    • 基本
      • 应用
        • router.php
      • 公共
        • 的index.html
        • 的.htaccess

我可以使用localhost/basic/public/访问我的索引页面,而我没有使用任何虚拟主机。

现在我想做两件事:

1:而不是localhost/basic/public/网址应该看起来像localhost/basic/才能访问主页。

2:应将/api/的所有请求重定向到router.php。例如,如果我发出/api/user/login这样的请求,它应该转到app/router.php,我可以根据api请求执行特定代码。

为了达到这个目的,我尝试在.htaccess文件中执行类似操作,但它不起作用:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/api/ [NC]
RewriteRule . ../app/router.php [NC,L]

此外,我不确定我们是否可以在RewriteRule中使用相对路径。

1 个答案:

答案 0 :(得分:3)

总结一下,你想要:

  • 有一种特殊情况:如果网址以/ basic / api开头,您希望它转到router.php页面
  • 默认情况下,应该公开搜索不属于文件的网址。

此外,您可以将转到/ basic / public / something的请求重定向到/ basic / something


将它放在基本文件夹中的文件.htaccess中:

RewriteEngine On
RewriteBase /preview/

#Special case: api requests
RewriteRule ^api/ app/router.php [L]

#Default case: all public files
#Alternativelly use RewriteCond %{REQUEST_URI} !/basic/public
RewriteCond %{REQUEST_URI} !/public/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ public/$1 [L]

#Optionally prevent both localhost/basic/public/file and localhost/basic/file
#outputting the same
#Using THE_REQUEST trick to only match external requests
RewriteCond %{THE_REQUEST} ^(POST|GET)\ /basic/public/
RewriteRule ^public/(.*)$ $1 [R,L]

这将执行以下操作:

localhost/basic/api/user/something在内部被重写为localhost/basic/app/router.php

localhost/basic/something在内部被重写为localhost/basic/public/something

localhost/basic/public/something从外部重定向到localhost/basic/something(然后在内部重写)

行为截屏:http://www.screenr.com/9GUN