Php 重写页面处理规则,指定目标页面名称而不是请求

Php 重写页面处理规则,指定目标页面名称而不是请求,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我有以下代码: RewriteEngine on RewriteRule api/v2/([^/]+)/?$ api/v2/api.php?request=$1 [L] RewriteRule api/v2 api/v2/api.php [L] RewriteRule ^$ handler.php?request=main [L] RewriteRule ^(.*)$ handler.php?request=$1 [L] …在根目录的my.htaccess文件中。其目的是重写https://

我有以下代码:

RewriteEngine on
RewriteRule api/v2/([^/]+)/?$ api/v2/api.php?request=$1 [L]
RewriteRule api/v2 api/v2/api.php [L]
RewriteRule ^$ handler.php?request=main [L]
RewriteRule ^(.*)$ handler.php?request=$1 [L]

…在根目录的my.htaccess文件中。其目的是重写
https://example.org/hello/world
https://example.org/handler.php?request=hello/world


每当我导航到现有目录时,它都会在末尾添加
?request
。例如:如果我导航到
https://example.org/foo
(foo是一个目录),它将重定向到
https://example.org/foo/?request=foo


为什么会发生这种情况?我如何修复它

更新1
我添加了以下行,它们可以根据需要工作:

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
但这又导致了另一个问题,当我转到handler.php并返回
$\u GET[“request”]
时,我得到了
handler.php


更新2
我将
.htaccess
缩短为:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
RewriteRule ^(.*)$ handler.php?request=$1 [L]
但是仍然有同样的问题,
$\u GET[“request”]
返回
handler.php


更新3

我在这个问题上加了一个悬赏,更多的是出于好奇,而不是现在的任何事情。

我会用相反的方法。 如果请求的文件不是现有文件或目录,则为请求的处理程序文件设置重写规则

测试了以下代码,它似乎可以工作

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ handler.php?request=$1 [L]
</IfModule>

输出:

array(1) { ["request"]=> string(11) "hello/world" }
Directory parent
File a exists //Something that is written in a.php

(确实存在)

输出:

array(1) { ["request"]=> string(11) "hello/world" }
Directory parent
File a exists //Something that is written in a.php

(确实存在)

输出:

array(1) { ["request"]=> string(11) "hello/world" }
Directory parent
File a exists //Something that is written in a.php

问题是,由于无条件规则和捕获所有模式,您的规则正在以循环模式重写请求,将目标文件handler.php重写为自身

您需要修复规则的模式,使其与目标文件不匹配

rewrite engine on
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
RewriteRule ^((?!handler.php).*)$ handler.php?request=$1 [L]

可能您需要在rule
RewriteRule^(.*)$handler.php?request=$1[L]
之前再添加一个
RewriteRule
,用于“如果不添加斜杠”,请查看我的答案。谢谢您的答案,但我不希望它加载现有文件/目录。我希望所有内容都通过handler.php运行,同时在提供的
GET
参数中给出请求。编辑已回答的问题,但是+1,因为它可能对将来的其他人有用。谢谢-这正是我所需要的!非常感谢你-厘米