我们正在将一个网站迁移到我们的 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
文件。问题是,出于某种原因,当我们访问/ouvidoria
URL 时,我们会被重定向到/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 帮助我解决第一个问题。