【问题标题】:Pretty URLs - Dot Causing Error漂亮的 URL - 引起错误的点
【发布时间】:2014-03-04 00:20:06
【问题描述】:

编辑:这个问题主要是通过下面的答案解决的,但它也提出了一个新问题。如果我从 .htaccess 文件中删除“RewriteCond %{REQUEST_FILENAME} !=F”,如果我向 stock.com/register 发出请求,我将再次被重定向到 stock.com/index.php?page=index.php。我可以接受它需要在那里,但我试图理解为什么删除这行代码会导致这种行为。我知道它在那里允许访问者访问实际文件,例如图像,但我不明白它与 URL 的重定向/重新路由(例如 stock.com/register)有什么关系。如果有人能解释一下,我将不胜感激。

试图为我在 Wampserver 上本地开发的简单 MVC 站点获取漂亮的 URL,仅用于学习目的。我有以下 .htaccess 代码设置,以便将任何 URL 请求路由回 index.php 控制器,该控制器根据“page”的 $_GET 值提供不同的内容。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !=D
RewriteCond %{REQUEST_FILENAME} !=F
RewriteRule ^([-\w.]+)$ index.php\?page=$1 [R=302,L]

我将它设置为 R=302,这样我就可以看到它将我重定向到哪里。我设置它工作的主机名是 stock.com。如果我去 stock.com,这很好用。但是如果我尝试访问 stock.com/register,我会被重定向到 stock.com/index.php?page=index.php。如果我从正则表达式中取出点,这一切都很好,但是我无法在页面/文件名中包含点。没有必要,但我这样做是为了学习目的,所以我想知道这里的解决方案是什么。我已经尝试过转义点和不转义。谢谢!

【问题讨论】:

  • .(点)表示除换行符以外的任何字符。您可能是指文字 \.
  • 感谢您的回答。我已经尝试了两种方法并得到了相同的结果。根据我的阅读,点不是字符类中的元字符,因此不需要转义。有错吗?
  • 不,这是正确的。我的错。 :)

标签: php regex .htaccess pretty-urls


【解决方案1】:

一些语法问题。试试这个代码:

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([-\w.]+)$ index.php?page=$1 [R=302,L,QSA]

【讨论】:

  • 谢谢,这很好用。如果您不介意并且只是出于学习目的,您能否解释一下为什么上面的 2 RewriteCond 会阻止我最初概述的行为(重定向到 stock.com/index.php?page=index.php)我只是遇到了麻烦我想看看这两个是如何连接的。再次感谢!
  • 是的,我可以解释。如果请求为有效文件 (!-f) 或目录 (!-d),则两条 RewriteCond 行将跳过此重写规则。只要有匹配的规则,重写引擎就会运行这些规则。因此,当重写规则再次运行时,如果没有这两个条件,它将重写为index.php?page=index.php。您可以看到您有一些规则,但由于语法错误而无法正常工作。但我不明白您为什么要从有效答案中删除接受标记。
  • 很抱歉取消接受,我的错。谢谢你的解释,这对我来说更有意义。我阅读了您发布的链接上的信息,以及它所帮助的图表。我再次道歉,但我只是没有得到的是,如果我输入的 URL 是 stock.com/lecture,为什么 index.php 不是 URL 的一部分?您的链接可能已经解释了这一点,只是我还不能理解。再次感谢。
  • 如果你从你的正则表达式中取出点,例如:^([-\w]+)$ 然后index.php 将不会被匹配,然后规则将不会为index.php 触发,请参阅第一次重写 URI 后变为/index.php 和它仍然匹配给定的正则表达式:^([-\w.]+)$ 因此重写规则再次执行匹配index.php
  • 是的,确实如此。当它第二次运行时,REQUEST_URI/index.phpQUERY_STRINGpage=register 你的规则只匹配 REQUEST_URI 并且它匹配 index.php
猜你喜欢
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多