如何在mod_rewrite中避免循环?

时间:2012-04-19 20:27:29

标签: php apache .htaccess

此问题已经过编辑以澄清:

我正在尝试创建“漂亮的网址”,应该按照以下方式伪装自己:

  

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]

不幸的是,这仍然会导致服务器错误。任何人都可以看到代码出错的地方吗?

2 个答案:

答案 0 :(得分: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]

只需忽略来自php中的get / request的NON

答案 1 :(得分:0)

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

它既丑陋又草率,但我首先要这样做的原因也是如此。