我的.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/start或http://domain.com/api/start/并接收$_GET['action'] - "start"
但我的.htaccess中的这个字符串不起作用
RewriteRule ^api\/(.*)$ api.php?action=$1 [L,QSA]
答案 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/帮助我尝试不同的组合