URL重写:防止完全在现有资源上重写

时间:2019-04-07 17:28:05

标签: php apache mod-rewrite

我根目录下面的.htaccess文件用于重写所有/ api /,然后从/api/api.php内$ _GET中的URL输出键值对?

如何修改此设置,以使通过此方案访问的api中所有现有文件或文件夹(例如/ api / test或/api/test/file.php)都不会通过重写规则进行重写?

<IfModule mod_rewrite.c> 
    Options +FollowSymlinks
    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/api
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    #RewriteRule (.*) $1
    RewriteCond %{QUERY_STRING} ^(.*)$
    RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [QSA,L]
    RewriteCond %{REQUEST_URI} ^/api
    RewriteCond %{QUERY_STRING} ^(.*)$
    RewriteRule ^([^/]+)/ $1/$1.php?%1 [L]
</IfModule>

2 个答案:

答案 0 :(得分:1)

您可以使用RewriteCond指令排除文件和文件夹

RewriteEngine On
#if not a file
RewriteCond %{REQUEST_FILENAME} !-f
#not a directory
RewriteCond %{REQUEST_FILENAME} !-d
#rewrite the /api request
RewriteCond %{REQUEST_URI} ^/api
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/ $1/$1.php?%1 [L]

答案 1 :(得分:0)

我制作了以下.htaccess文件以包含目录索引和后备资源,并将其放置在根目录中,以捕获来自根的每个请求。

我还放置了rewritebase / api和InheritDown选项来限制我应用这些规则的位置,并递归地传播到已经存在的目录,以便它们(和嵌套文件)在请求时不会包含在重写过程中。

这在$ _GET上产生了成功的结果,条件是在查询字符串中有相等数量的lhs(key)= rhs(value)对,条件是它们在/ api / lhs / rhs / lhs / rhs中输入请求。

 <IfModule mod_rewrite.c> 
    Options +FollowSymlinks
    RewriteEngine On
    DirectoryIndex api.php
    FallbackResource index.php
    RewriteCond %{REQUEST_URI} ^/api
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} ^/api
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{QUERY_STRING} ^(.*)$
    RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [QSA,L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{QUERY_STRING} ^(.*)$
    RewriteRule ^([^/]+)/ $1/$1.php?%1 [L]
</IfModule>

RewriteBase /api
RewriteOptions InheritDown