【发布时间】: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