2012-04-19 110 views
0

这个问题已经被编辑过澄清:如何避免在mod_rewrite中循环?

我想如下打造“漂亮网址”应该把自己伪装:

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] 

不幸的是,这还是引起了服务器错误。任何人都可以看到代码出错的地方吗?

+0

虽然我非常有信心可以将一些基于RewriteCond的规则集中在一起来帮助您解决这个特定情况,但这可能无济于事。有关您需要处理的页数的更多信息,以及如何维护“p”值与友好URL之间的映射关系,这对您的问题会有帮助。 – timdev 2012-04-19 20:45:21

+0

当然,让我更详细地解释一下: “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“变量只是伪装成目录 我希望这是有道理的。 – inveni0 2012-04-19 20:58:45

+1

为什么不直接在$ p变量中命名页面,以便您可以执行诸如www.mysite.com/about/ - > www.mysite.com/page .php?p =大约。这只需要1条规则,而不必为每个页面设置规则 – Tom 2012-04-19 21:00:39

回答

0

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

这是丑陋的,马虎,但我也必须这样做的原因是这样。

0

如果你愿意,你可以在后台设置一个虚拟查询变量var。尝试这样的:

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] 

而只是忽略NON从get/request在PHP中。

+0

我在这里测试过了,它失败了。我不太熟悉,不知道它是语法错误还是工具错误。 http://martinmelin.se/rewrite-rule-tester/ – inveni0 2012-04-19 22:11:56

+0

@ inveni0然后尝试http://htaccess.madewithlove.be/(或先在本地机器上测试xampp),因为NOT('!')doesn似乎没有编入你给的网站 – craniumonempty 2012-04-19 23:00:36

+0

好得多。我修改了您的答案: '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 2012-04-19 23:39:25