嗨&谢谢你阅读我:我有一个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脚本有问题,但我不知道是什么问题
1条答案
按热度按时间l5tcr1uw1#
你已经把你的自定义重写放在了错误的地方,正如我在第一条评论中提到的,“如果你把这个规则放在了文件的末尾,那么这就是一个问题”,这是因为请求已经被写入
index.php
,下面的规则(匹配/api/<anything>
)永远不匹配。在原始规则块中,您使用了L
标志,这意味着该规则根本不会被处理。您的自定义重写需要在对前端控制器进行常规重写之前进行。
但是,来自服务器的响应似乎并不一致:
example.com/
-返回有效响应(您的“主页”?)example.com/does-not-exist
-返回与上述相同的结果(有效的200 OK响应)example.com/api
-实际上返回空白页(200 OK响应)example.com/api/
-“未找到文件”和404响应状态example.com/api/does-not-exist
-同上-“未找到文件”和404响应状态。所以,这里似乎有“其他的东西”在发生。从你发布的内容来看,响应大概是由
index.php
决定的?然而...。在查看HTTP响应时,
example.com/api
(无尾部斜杠)有一个额外的标头content-location: api.php
和vary: negotiate
。这意味着您有一个文件api.php
,并且启用了MultiViews
(mod_negotiation的一部分)。需要禁用“多视图”才能按预期进行重写。例如,请尝试以下操作:
我还在正则表达式中包含了字符串开头锚,以避免匹配“太多”。
您的规则也只匹配
/api/
(没有第二个路径段)-这是一个有效的请求吗?这仍然依赖于你的前端控制器(例如
index.php
)正确解析请求。最后一个规则是一个通用的前端控制器模式,你可能从$_SERVER['REQUEST_URI']
PHP超全局阅读请求的URL。但是,在你的自定义重写中,你可能需要覆盖这个行为。