【问题标题】:How Do I Avoid Loops in mod_rewrite?如何避免 mod_rewrite 中的循环?
【发布时间】:2012-04-19 20:27:28
【问题描述】:

为了澄清这个问题已经过编辑:

我正在尝试创建“漂亮的 URL”,它们应该如下伪装:

mysite.com/index.php?p=1 ==> mysite.com/site_one/index.php

mysite.com/aboutus.php?p=2 ==> mysite.com/site_two/aboutus.php

mysite.com/anypage.php?p=3 ==> mysite.com/site_three/anypage.php

如您所见,mod_rewrite 应该简单地将“p”变量转换为预先确定的伪目录(该目录不存在……这只是美学上的重写)。

显然,这会造成复杂情况。当用户访问 mysite.com/site_one/index.php 时,应该有一个 背景 转移到 mysite.com/index.php?p=1。此后台传输会导致导致服务器错误的循环。

我已尝试使用以下代码来防止此循环:

RewriteCond %{QUERY_STRING} !NON=
RewriteCond %{QUERY_STRING} ^(.*[&?])?p=1([&].*)?$
RewriteRule ^/?(.*)  /site_one/$1 [PT,L]


RewriteCond %{QUERY_STRING} !NON=
RewriteRule ^/?site_one/?(.*)  /$1?NON=1&p=1 [PT,L]

不幸的是,这仍然会导致服务器错误。谁能看到代码哪里出错了?

【问题讨论】:

  • 虽然我非常有信心可以组合一些基于 RewriteCond 的规则来帮助您处理特定情况,但这可能无济于事。有关您需要处理的页面数量以及如何维护“p”值与友好 URL 之间的映射的更多信息将对您的问题有所帮助。
  • 当然,让我更详细地解释一下:“p”的值可能会发生变化,因此我将为“p”的每个值添加规则。例如,如果“p=1”,该站点将显示“mysite.com/site_one”。如果“p=2”,该站点将显示“mysite.com/site_two”。如果“p=3”并且用户正在调用一个名为“about.php”的页面,该站点应该显示“mysite.com/site_three/about.php”。基本上,“p”变量只是伪装成一个目录。我希望这是有道理的。
  • 为什么不直接在 $p 变量中命名页面,这样你就可以做类似 www.mysite.com/about/ --> www.mysite.com/page.php ?p=约。那只需要 1 条规则,而不必为每个页面设置规则
  • 因为我必须在我的 PHP 代码中将“p”的值转换为整数,并且我必须确保我上传的每个页面(很多)都包含这个转换。只在主级别有一个全局规则会更容易,它会使 php 代码更容易管理。
  • 在您的数据库中添加另一个名为“URL”的列,您将能够使用它来检索页面,而不必使用 ID

标签: php apache .htaccess


【解决方案1】:

如果需要,您可以在后台设置一个虚拟查询变量。试试这样的:

RewriteEngine On

RewriteCond %{QUERY_STRING} !NON=
RewriteCond %{QUERY_STRING} ^(.*[&?])?p=1([&].*)?$
RewriteRule ^/?page.php  /main_site/ [R,QSA]

RewriteCond %{QUERY_STRING} !NON=
RewriteRule ^/?main_site/?(.*)  /page.php?NON=1&p=1&extra=$1 [QSA,L]

然后在 php 中忽略来自 get/request 的 NON

【讨论】:

  • 我在这里测试过,但失败了。我不够熟悉,不知道这是语法错误还是工具错误。 martinmelin.se/rewrite-rule-tester
  • @inveni0 然后尝试htaccess.madewithlove.be(或先在本地机器上测试 xampp),因为 NOT (!) 似乎没有被编程到您提供的站点中
  • 好多了。我修改了您对此的回答:RewriteCond %{QUERY_STRING} !NON= RewriteCond %{QUERY_STRING} ^(.*[&?])?p=1([&].*)?$ RewriteRule ^/?(.*) /main_site/$1 [PT,L] RewriteCond %{QUERY_STRING} !NON= RewriteRule ^/?main_site/?(.*) /$1?NON=1&p=1 [PT,L] 它在测试站点上显示为正常,但在我的服务器上不起作用(内部服务器错误)。关于可能导致这种情况的任何想法?
  • @inveni0 我不确定你在做什么。在第一条规则中,它基本上说目录中的所有内容都发送到/main_site(这包括如果调用/main_site),只要它在查询字符串中有p=1而不是NON=1。第二个表示如果查询中没有NON=1,则将/mainsite/<something> 中的所有内容发送到/<something>?NON=1&p=1。因为第一个有一个 [L] 标志,所以它滚动到下一个。你最终永远不会把 NON=1 放在它上面,每次它进入一个文件夹时,它都会增加更多,所以你最终会无休止地 http://host.com/mainsite/mainsite/mainsite/mainsite/... 直到崩溃
【解决方案2】:

我最终不得不解决这个问题,因为没有 htaccess 方法对我有帮助。我基本上将“p”的所有值转发到适当的页面并将变量“p”更改为变量“s”。然后我告诉我的网络应用程序“p”的值等于“s”存在的“s”的值。我将此代码放在与服务器通信的文件中,因此它存在于我网站的所有页面上。

这既丑陋又草率,但这也是我必须首先这样做的原因。

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多