php - 用于页面处理的 RewriteRule 给出目标页面名称而不是请求

标签 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]


...在我的根目录中的 .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/

相关文章:

apache - 拒绝用户使用 .htaccess 访问 php.ini 文件

.htaccess - 将一台服务器上的多个域重定向到各自的 https ://www. 目标

javascript - 基于 Javascript 函数值,通过 PHP 检索数据库数据

php - 如果我在表名后使用任何条件,表的最后一行不显示

javascript - 使用 Symfony/Twig 进行 jQuery 文件上传

apache - 在 Ubuntu 上安装 Mahout 时 Maven BUILD FAILURE

通过node.js的ajax跨域发布

php - 如何处理 select 语句除以 0?

java - 在 tomcat + JAX-RS 上预处理 BASIC 身份验证的 REST 请求

c++ - Linux下如何统计多进程应用的CPU使用率