apache 设置了PHP / MVC的API

ar7v8xwq  于 2023-03-03  发布在  Apache
关注(0)|答案(1)|浏览(104)

嗨&谢谢你阅读我:我有一个MVC webApp,设置如下:

  • 具有以下.htaccess的根文件夹:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !(.*)\.(png|jpg)$
RewriteRule    ^$    public/    [L]
RewriteRule    (.*) public/$1    [L]

这会将所有文件重定向到“Public”文件夹,该文件夹依次包含以下.htaccess文件:

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

这绝对适用于将所有请求重定向到控制器等。我想写2个具体的和单独的规则,(我猜重写的规则在原则上是相似的)。我不是要求规则(即使这将是伟大的!),但类似于:

definition/([a-zA-Z\-]+) ?p=word.word_show&action=read_word_data&word=$1
// OR
RewriteRule api/([a-zA-Z\-]+) ?p=api.word.word_show&action=read_word_data&word=$1

不起作用&我不明白为什么...
没有名为“definition”或“API”的文件夹,我也不“打算”创建它们...
非常感谢你带我走上正确的方向...
再次嗨,谢谢!我已经上网,以便您可以审查,但仍然不工作:.htaccess如下所示:

RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ index.php
    RewriteRule api/([^/]*)$ index.php?p=api.word.word_show&action=read_word_data&word=$1 [L]

网址:www.dictionnaire-commercial.com
添加替换URL时:
index.php?p=api.word.word_show&action=read_word_data&word=whatever
剧本起作用了...
htaccess脚本有问题,但我不知道是什么问题

l5tcr1uw

l5tcr1uw1#

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php
RewriteRule api/([^/]*)$ index.php?p=api.word.word_show&action=read_word_data&word=$1 [L]

你已经把你的自定义重写放在了错误的地方,正如我在第一条评论中提到的,“如果你把这个规则放在了文件的末尾,那么这就是一个问题”,这是因为请求已经被写入index.php,下面的规则(匹配/api/<anything>)永远不匹配。在原始规则块中,您使用了L标志,这意味着该规则根本不会被处理。
您的自定义重写需要在对前端控制器进行常规重写之前进行。
但是,来自服务器的响应似乎并不一致:

  1. example.com/-返回有效响应(您的“主页”?)
  2. example.com/does-not-exist-返回与上述相同的结果(有效的200 OK响应)
  3. example.com/api-实际上返回空白页(200 OK响应)
  4. example.com/api/-“未找到文件”和404响应状态
  5. example.com/api/does-not-exist-同上-“未找到文件”和404响应状态。
    所以,这里似乎有“其他的东西”在发生。从你发布的内容来看,响应大概是由index.php决定的?然而...。
    在查看HTTP响应时,example.com/api(无尾部斜杠)有一个额外的标头content-location: api.phpvary: negotiate。这意味着您有一个文件api.php,并且启用了MultiViews(mod_negotiation的一部分)。需要禁用“多视图”才能按预期进行重写。
    例如,请尝试以下操作:
Options -MultiViews

DirectoryIndex index.php

RewriteEngine On

RewriteRule ^index\.php$ - [L]

RewriteRule ^api/([^/]*)$ index.php?p=api.word.word_show&action=read_word_data&word=$1 [L]

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

我还在正则表达式中包含了字符串开头锚,以避免匹配“太多”。
您的规则也只匹配/api/(没有第二个路径段)-这是一个有效的请求吗?
这仍然依赖于你的前端控制器(例如index.php)正确解析请求。最后一个规则是一个通用的前端控制器模式,你可能从$_SERVER['REQUEST_URI'] PHP超全局阅读请求的URL。但是,在你的自定义重写中,你可能需要覆盖这个行为。

相关问题