【问题标题】:Why am I getting a 404 for a page without the trailing slash but it works with the trailing slash?为什么我在没有斜杠的页面上得到 404,但它与斜杠一起使用?
【发布时间】:2012-05-03 06:40:46
【问题描述】:

我有一个允许用户创建和构建网站的应用程序。我们称之为 system.com。当用户创建一个带有他们已转发到我们的名称服务器的域(例如 domain.com)的站点时,它会创建文件夹并通过 cPanel API 将他们的域添加到我们的服务器到像 这样的文件夹system.com/[用户 ID]/[站点 ID]/。在该文件夹中有一个 index.php 文件和一个 .htaccess 文件,内容如下:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)/$ index.php?page=$1 [L]

我不会从那里详细介绍它的工作原理,但基本上用户可以创建像 domain.com/something/something-else/ 这样的页面。 “something”文件夹显然并不真正存在,我们的系统只是从 htaccess 中获取它们并从那里开始。

我的问题是 domain.com/something/something-else/ 有效,但 domain.com/something/something-else 返回 404。我一直做研究并尝试很多事情,但似乎无法让它发挥作用。有任何想法吗?提前致谢。

编辑

我应该提到到目前为止我所尝试的。我尝试将重写规则更改为不管尾斜杠如何工作,如下所示:

RewriteRule ^(.*)(?/$) index.php?page=$1 [L]

以及它的其他变体。

我也尝试了不同的方法来强制使用斜杠,但这些方法都不起作用。

【问题讨论】:

  • 看起来网络服务器将domain.com/something/something-else 视为文件something-elsesomething-else/ 之类的文件夹。尝试从您的RewriteRule 中删除/,例如RewriteRule ^(.*)$ index.php?page=$1 [L]
  • 所以你的意思是如果用户输入一个没有斜杠的url,那么url重写器必须自动添加一个斜杠?
  • 嗯,不,那也没用。
  • 那你想做什么?
  • @Mahan 理想情况下,它应该拉出正确的页面,无论是否有斜杠,但如果它还执行添加斜杠的初始重定向,那就没问题了。我只是不明白为什么没有任何效果——即使是像RewriteRule ^something/something-else$ /something/something-else/ [R=301]这样的标准 301@

标签: php apache .htaccess http-status-code-404


【解决方案1】:

我认为您希望您的规则如下所示:

RewriteRule ^(.*)/?$ index.php?page=$1 [L]

其中说:“任何数量的任意字符(可选地后跟斜杠)都应更改为 index.php?page=$1 其中 $1 是您在斜杠之前找到的字符。如果这个规则也忽略您找到的任何其他规则匹配。”

【讨论】:

    【解决方案2】:

    它基于您的 url 重写访问规则..

    RewriteRule ^(.*)/$ index.php?page=$1 [L]
    

    如您所见,index.php?page=$1 别名为 /,所有请求都发送到 index.php

    【讨论】:

    • 对,这就是我们想要的行为,当你有一个斜杠时一切正常。我在原始帖子中添加了一个编辑,以显示我尝试过的一些修复
    猜你喜欢
    • 2021-01-20
    • 2012-02-05
    • 2017-02-25
    • 2019-01-28
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多