Apache mod_rewrite Restful api

时间:2015-04-25 22:21:25

标签: apache .htaccess mod-rewrite

我在我的restful webapp中遇到了正确的.htaccess问题。我的REST api代码可以通过URL-pattern * / api / **访问,它应该被重定向到 api 文件夹中的 index.php

所有其他网址(静态文件除外)应重定向到根文件夹中的 index.html

我有以下文件夹结构:

- api
-- application/...
-- vendor/...
-- index.php
- public
-- css/...
-- js/...
- index.html
- .htaccess

这是我的.htaccess内容:

Options +FollowSymLinks
RewriteEngine on

# redirect all api calls to /api/index.php
RewriteCond "%{REQUEST_URI}" "^/api"
RewriteRule "^/api/(.+)$" "/api/index.php$" [QSA,L]

# If the request is a file, folder or symlink that exists, serve it up
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+)$ - [S=1]

# otherwise, serve your index.html app
RewriteRule ^(.+)$ /index.html [L]

我尝试将另一个.htaccess添加到api文件夹,使用/ api / *重定向URL但没有任何成功。所以我尝试在上面的.htaccess中使用规则重定向它。

我认为较低的规则可能是正确的。因为重定向正在按预期工作。但/ api /规则不起作用。似乎请求也重定向到index.html

我错过了什么?

2 个答案:

答案 0 :(得分:3)

您需要对正则表达式模式进行一些小调整:

DirectoryIndex index.php index.html
Options +FollowSymLinks
RewriteEngine on

# redirect all api calls to /api/index.php
RewriteRule ^api/((?!index\.php$).+)$ api/index.php [L,NC]

# If the request is a file, folder or symlink that exists, serve it up
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# otherwise, serve your index.html app
RewriteRule ^(.+)$ index.html [L]

答案 1 :(得分:1)

尝试以下规则:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_URI} !^/api/index\.php$ [NC]
RewriteCond %{REQUEST_URI} ^/api [NC]
RewriteRule ^api/.* /api/index.php$ [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l # to check for symbolic links
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /index.html [L]

RewriteRule . - [L]