两个RewriteRule用于两个不同但同样的网址

时间:2014-11-22 15:42:28

标签: php .htaccess mod-rewrite

我的.htaccess是

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#RewriteRule ^api\/(.*)$ api.php?action=$1 [L,QSA]
RewriteRule . index.php [L]

所以我在index.php中收到的所有请求然后解析查询字符串,我的一个页面是" api文档页面"使用网址http://domain.com/api,所以我需要有关模板中api的页面

另一个网址为http://domain.com/api.php,我需要$_GET['action']$_POST

的其他数据

所以它会像http://domain.com/api.php?action=start一样有效,但我需要调用http://domain.com/api/starthttp://domain.com/api/start/并接收$_GET['action'] - "start"

但我的.htaccess中的这个字符串不起作用

RewriteRule ^api\/(.*)$ api.php?action=$1 [L,QSA] 

3 个答案:

答案 0 :(得分:2)

如果您要申请所有网址或将其保存在单独的规则中,则需要在RewriteCond之前保留RewriteRule。试试这个.htaccess:

Options -MultiViews
RewriteEngine On
RewriteBase /

# ignore all files/directories from all rules below
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^api/(.+)$ api.php?action=$1 [L,NC,QSA]

RewriteRule . index.php [L]

答案 1 :(得分:1)

啊,之前我遇到过这个问题,不记得究竟是怎么回事,但这个链接似乎很相关:https://wiki.apache.org/httpd/RewriteFlags/QSA

与你的唯一区别是开头的斜线使路径绝对,你不需要逃避斜线。 E.g。

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^api/([a-z]*)/? api.php?action=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . index.php [L]

但这些差异似乎都不是导致问题的原因。正如努巴瓦所指出的那样,RewriteCond只会影响下一个规则。 当遇到这种情况时,我通常最终使用路由器来在PHP中进行“重写”。 另请参阅Mod-Rewrite or PHP router?

答案 2 :(得分:0)

RewriteEngine On
RewriteBase /

RewriteRule ^api/([^/]*)$ /api.php?action=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

工作,http://htaccess.madewithlove.be/帮助我尝试不同的组合