RewriteRule 冲突和尾部斜杠

RewriteRule 冲突和尾部斜杠

我们正在将一个网站迁移到我们的 cPanel 基础架构。客户使用 Nginx 在自己的基础架构上托管该网站。他将他的 Nginx 配置文件发送给我们,我们将其转换为 Apache Rewrite 规则。最终结果(仅显示相关行)如下所示:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ouvidoria/$ /ouvidoria/index.php
RewriteRule ^([^/\.]+)/?$ index.php?id=$1 [L]
RewriteRule ^news\/(.*)/?$ noticias.php?id=$1 [L]

一切都按预期运行,除了一个页面,即/ouvidoria。此特定页面在 public_html 上有一个同名目录,因此 RewriteRule 指向该ouvidoria/index.php文件。问题是,出于某种原因,当我们访问/ouvidoriaURL 时,我们会被重定向到/ouvidoria/?id=ouvidoria,这似乎属于倒数第二条规则。所以这是第一个需要解决的问题。

第二个问题是,我们可以访问带有尾部斜杠 ( ) 的 URL /ouvidoria/,但它不会附加?id=ouvidoria,但该网站的开发方式是侧边菜单会根据 URL 进行加载。它只会在没有尾部斜杠的情况下加载。即使我们从第一个问题中删除有问题的规则(这不是解决方案,因为其他页面需要它),它也会重定向/ouvidoria/ouvidoria/,从而无法加载菜单。

任何有关如何使这些规则发挥作用的帮助都将受到感谢。

编辑:

剩下的唯一问题是从/ouvidoria到 的重定向/ouvidoria/。网络选项卡屏幕截图:

“网络”选项卡

重定向详细信息:

重定向详细信息

答案1

更新了解决“重定向到子目录”问题的答案。请尝试以下一组指令:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ouvidoria/?$ /ouvidoria/index.php [L]
RewriteRule ^([^/\.]+)/?$ index.php?id=$1 [L]
RewriteRule ^news\/(.*)/?$ noticias.php?id=$1 [L]

通过删除RewriteCond %{REQUEST_FILENAME} !-d,Apache 不会检查是否存在包含所请求资源的目录。这可能会帮助您解决问题。


原始答案:

我已经有一段时间没有使用 Apache 规则了,但我认为以下更改将有助于您实现目标:

代替

RewriteRule ^ouvidoria/$ /ouvidoria/index.php

RewriteRule ^ouvidoria/?$ /ouvidoria/index.php [L]

规则的原始版本仅匹配/ouvidoria/URI。因此请求到达第二个RewriteRule,这会导致您所描述的行为。

该规则的固定版本与/ouvidoria/和都匹配/ouvidoria

答案2

好吧,出于某种原因,该指令DirectorySlash Off现在起作用了。我之前已经尝试过将其关闭,但它会产生错误 500。我已经多次重写了这些规则,也许我删除了与 DirectorySlash 冲突的内容,现在该指令可以按预期工作了。

还要感谢@Tero Kilkanen 帮助我解决第一个问题。

相关内容