0

我遇到了一个 mod_rewrite 问题,我的 .htaccess 文件中的第二个规则覆盖了第一个。有问题的 .htaccess 文件如下所示:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /path/appname

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule /api/v1/(.*)$ api/v1/index.php?rquest=$1 [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
</IfModule>

我看到的问题是这样的:

如果我直接访问http://example.com/path/appname/api/v1/valid/endpoint第一个 RewriteRule 会正确触发,我会从 API 中获取结果。

但是,假设我访问http://example.com/path/appname/app - 一个已根据第二个 RewriteRule 重写的页面。此页面向 api/v1 页面发出 AJAX 请求。相反,这些请求通过第二个 RewriteRule 定向并发送到我的基本 index.php 页面。

我对这可能是怎么回事感到困惑,因为我的理解是 [L] 标志一旦匹配就会阻止任何进一步的规则运行,因此一旦任何包含“api/v1”的请求都应该捕获并停止检查对于任何进一步的比赛。我需要更改什么才能使其正常工作?

谢谢!

4

1 回答 1

0

您应该排除前一个规则集的段路径,因此不会再次处理它。像这样:

# Don't redirect/map when folders or files exist 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Exclude the previous path
RewriteCond %{REQUEST_URI} !api/v1/?   [NC]

# Prevent loops
RewriteCond %{REQUEST_URI} !index\.php [NC]

RewriteRule . index.php                [L]

</IfModule>

用上面的行替换您问题中的最后 4 行。

于 2013-03-13T20:02:10.857 回答