代码之家  ›  专栏  ›  技术社区  ›  Kazmi John Boker

在URL中添加查询字符串行后,URL重写无法正常工作

  •  1
  • Kazmi John Boker  · 技术社区  · 7 年前

    此URL重写行工作正常 直到查询字符串行 ,并且在查询字符串之后,它们中的任何一个都不起作用。

    ReWriteEngine On
    ReWriteRule ^home?$ /mysite/index.php
    ReWriteRule ^gallery?$ /mysite/gallery.php
    ReWriteRule ^([a-z0-9]+)?$ /mysite/owner.php?name=$1
    ReWriteRule ^about?$ /mysite/about.php
    ReWriteRule ^location?$ /mysite/location.php
    

    前两行 陈列室 按预期工作(包括第三条线 查询字符串 ),但其他两行 关于和位置 不要工作。 如果我要求那两页 使用重写的名称 ,则, 页面未进入浏览器 (回复没有什么,而且我得到的是与我当前所在的页面相同的页面,甚至没有收到404错误消息),但是如果我请求这些页面 使用原始名称。php扩展 该页面将进入浏览器。我试着把那两个 关于和位置 在查询字符串行的顶部,这两个页面可以正常工作 ,但当它们位于查询字符串行下方时,只有它们不起作用。 我能知道URL重写方法有什么问题吗?我仍然无法找出这个问题。

    2 回复  |  直到 7 年前
        1
  •  1
  •   arkascha    7 年前

    您的尝试存在许多问题,下面是一个稍加修改的版本:

    ReWriteEngine On
    ReWriteRule ^/?home/?$ /mysite/index.php [END]
    ReWriteRule ^/?gallery/?$ /mysite/gallery.php [END]
    ReWriteRule ^/?about/?$ /mysite/about.php [END]
    ReWriteRule ^/?location/?$ /mysite/location.php [END]
    ReWriteRule ^([a-z0-9]+)/?$ /mysite/owner.php?name=$1 [END]
    

    规则的顺序很重要。应放置更一般的 在下面 更专业的。

    如果您在上述设置中遇到http状态500(服务器内部错误),很可能您操作的是非常旧版本的apache http服务器。在这种情况下,更换 [END] 标记为 [L] 在这种情况下也可以正常工作的标志。


    上述规则在真正的http服务器主机配置和动态配置文件中也同样适用。

    还有一个一般性提示:您应该始终希望将此类规则放置在http服务器(虚拟)主机配置中,而不是使用动态配置文件( .htaccess 样式文件)。这些文件是出了名的容易出错、难以调试,而且它们确实会降低服务器的运行速度。只有在您无法控制主机配置的情况下(阅读:非常便宜的托管服务提供商),或者如果您的应用程序依赖于编写自己的重写规则(这显然是一个安全噩梦),才支持将其作为最后一个选项。

        2
  •  1
  •   ArtisticPhoenix    7 年前

    我会改变这些的顺序

    ReWriteRule ^([a-z0-9]+)?$ /mysite/owner.php?name=$1
    ReWriteRule ^about?$ /mysite/about.php
    ReWriteRule ^location?$ /mysite/location.php
    

    ReWriteRule ^about$ /mysite/about.php [L]
    ReWriteRule ^location$ /mysite/location.php [L]
    ReWriteRule ^([a-z0-9]+)$ /mysite/owner.php?name=$1 [L]
    

    并添加最后一个标志。

    结果是 ^([a-z0-9]+)? 更通用,在达到最后2条规则之前匹配并更改URL。

    换句话说,如果你有一个URL about 与此匹配 ^([a-z0-9]+)? 已更改,但与实际规则不匹配。因此,将更通用的规则放在最后,可以避免这种情况。

    正如我在评论中所说的那样,我将添加 [L] 在或中标记 Last 这样,一旦匹配完成,就可以结束重写,否则可能会得到意外的匹配。

    您还可以将其中一些(可能)组合在一起

     ReWriteRule ^(about|location)$ /mysite/$1.php [L]
    

    我很确定 ? 表示前面的匹配是可选的,但我删除了它,因为如果不是,则捕获组是可选的。所以我不知道你在那里的目的是什么。因为我读到这意味着 ^about?$ 使用 t 可选。。。