我们正在将网站迁移到我们的 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
,这似乎属于倒数第二条规则。所以这是第一个要解决的问题。
第二个是我们可以使用尾部斜杠 ( /ouvidoria/
) 访问 URL,它不会附加?id=ouvidoria
,但是,该网站的开发方式是根据 URL 加载侧边菜单。它只会在没有斜杠的情况下加载。即使我们从第一个问题中删除有问题的规则(这不是解决方案,因为在其他页面中需要它),它也会重定向/ouvidoria
到/ouvidoria/
,因此无法加载菜单。
任何有关如何使这些规则起作用的帮助将不胜感激。
编辑:
剩下的唯一问题是从/ouvidoria
to重定向/ouvidoria/
。网络标签截图:
重定向细节:
更新了解决“重定向到子目录”问题的答案。尝试以下指令集:
通过删除
RewriteCond %{REQUEST_FILENAME} !-d
,Apache 不会检查具有所请求资源的目录是否存在。这可能有助于解决您的问题。原答案:
自从我使用 Apache 规则以来已经有一段时间了,但我认为以下更改将帮助您实现目标:
代替
和
规则的原始版本仅匹配
/ouvidoria/
URI。因此,请求到达 secondRewriteRule
,这会导致您描述的行为。规则的固定版本同时匹配
/ouvidoria/
和/ouvidoria
。好吧,由于某种原因,该指令
DirectorySlash Off
现在起作用了。我之前已经尝试将其设置为关闭,但它会生成错误 500。我已经多次重写这些规则,也许我删除了与 DirectorySlash 冲突的东西,现在该指令按预期工作。还要感谢@Tero Kilkanen 帮助我解决了第一个问题。