2012-01-21 35 views
-1

我試圖從www.xxx.com/test.com重寫URL來www.xxx.com/my.php?d=test.com 使用以下指令:URL重寫遞歸

 
     Options Indexes FollowSymLinks 
     RewriteEngine On 

     RewriteRule ^((.+)\.(.+))$ my.php?d=$1 

這是行不通的,例如,該網址是www.xxx.com/test.com 它似乎將它重寫爲www.xxx.com/my.php?d=test.com 然後重寫爲www .xx.com/my.php?d = my.php或類似的東西。這是否意味着模式正在遞歸應用? 如何修復正則表達式?

回答

0

Mod重寫將通過重寫引擎一遍又一遍地運行URI,直到通過重寫引擎之前和之後的URI相同。這是發生了什麼:

  1. URI是test.com
  2. 規則^((.+)\.(.+))$比賽,URI改寫爲my.php(有一些查詢字符串d = test.com
  3. 比較:test.commy.php不一樣,通過重寫引擎運行URI返回
  4. URI是my.php
  5. 規則^((.+)\.(.+))$火柴,URI改寫爲my.php(有一些查詢字符串d = my.php
  6. 比較:my.php是同my.php,之前和URI比賽結束後,停止寫入

你的結果是/my.php?d=my.php

您需要添加一個條件,以便my.php不會應用規則。您的重寫規則之前添加此

RewriteCond %{REQUEST_URI} !^/my.php 
+0

沒問題,他的問題與我的類似,在我的情況下,「my.php」是動態調用的。所以Apache在應用規則之前不知道將調用哪個文件。 'RewriteRule([^ /] *)/(。*)?$ .../$ 1/index.php?params = $ 2 [NC,L]'是我所得到的。任何想法如何使一個條件,將允許Apache只能重定向一次? –

0

這個工作對我來說:

RewriteRule ^(.+)\.(.+)$ my.php?d=$1.$2 

的作用不在於規則遞歸應用(即不會發生),它根本不匹配。

順便說一句,如果你想讓引擎停在特定的行,你可以添加[L]。

測試重寫規則的簡單方法是this website

+0

沒有這個新的REG仍然匹配my.php?d = my.php – user121196

+0

該網站,順便說一句,不會趕上遞歸問題。我有同樣的問題,並且對我的 –