我有这个代码:
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]
...在我的根目录中的 .htaccess 文件中。它的目的是用 https://example.org/handler.php?request=hello/world
重写 https://example.org/hello/world
。< br/>
每当我导航到现有目录时,它都会在末尾添加 ?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 并 echo $_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]
但仍然有同样的问题,$_GET["request"]
返回handler.php
更新3
我对这个问题添加了悬赏,更多的是出于好奇。
最佳答案
问题在于,由于无条件规则和包罗万象的模式,您的规则以循环模式重写请求,将目标文件 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]
关于php - 用于页面处理的 RewriteRule 给出目标页面名称而不是请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47321721/