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,因为它可能对将来的其他人有用。谢谢-这正是我所需要的!非常感谢你-厘米