2014-01-11 44 views
0

對於通訊,我試圖讓乾淨的URL的網頁退訂的Apache2改寫怪異的行爲

起初我有這個,但它不工作:

RewriteEngine On 
RewriteBase/
RewriteRule ^/unsubscribe/(.*)$ /unsubscribe.php?email=$1 [NC,L] 

這是非常在我看來很奇怪。所以我嘗試了其他一些方法,最後得到以下結果:

RewriteEngine On 
RewriteBase/
RewriteRule ^/?unsubscribe/?(.*)$ /unsubscribe.php?email=$1 [NC,L] 

這實際上是在工作。但它給出了非常奇怪的結果。

email參數值現在爲:

.PHP /測試

這是推動我堅果,因爲我不明白爲什麼它是表現這種方式。

有沒有人對這裏發生的事情有一個想法,以及如何解決這個問題?

我寧願不結束字符串取代PHP,這裏有錯誤。

回答

1

你好嗎? :)

你可以試試這個,讓我知道它是否有效?讓我們弄清楚這一點!

RewriteEngine敘述在

重寫規則^退訂1 /([^/.]+)/?$ unsubscribe.php?電子郵件= $ [L]

+0

謝謝你的回覆,我試過你的規則,它什麼也沒做。這似乎是正斜槓被忽略或什麼的。非常奇怪 – baklap

1

你的第一個規則是不行的,因爲規則獲取網址中的基礎。所以如果URL是/unsubscribe/[email protected],RewriteBase/)被刪除,並且RewriteRule將看到unsubscribe/[email protected]沒有前導/。

在您的第二條規則中,BOTH /-可由?選擇。因此unsubscribe.php/test將找到字面值unsubscribe,並將它放在它後面 - .php/test - 並將其放入電子郵件參數中。猜測你的瀏覽器在測試時應該使用/unsubscribe/test,而不是/unsubscribe.php/test

+0

感謝您的回覆。 我沒有在我的瀏覽器中使用/unsubscribe.php/test,剛剛/取消/測試 我改變了htaccess以及去除RewriteBase,取而代之的只是這個規則: 重寫規則^ /退訂$ /unsubscribe.php ?email = test [NC,L] 這不起作用;只是一個空的參數。 – baklap

+0

保留RewriteBase,但將模式'^/unsubs ...'更改爲'^ unsubs ...'(刪除前導斜槓)。就像WarriorTurtle建議的一樣,但是也有'RewriteBase /',就像你在第一個例子中那樣。 –

+0

RewriteEngine On RewriteBase/ RewriteRule^unsubscribe $ unsubscribe.php?email = test 不工作,它好像忽略了斜槓或某些東西 – baklap

0

好吧,它解決了。

它似乎像MultiViews(不管那可能是)默認啓用。

添加:

Options -MultiViews 

要htaccess的(或apache配置)固定的問題。

1

此規則應該爲你工作:

Options -MultiViews 
RewriteEngine On 
RewriteBase/

RewriteRule ^/?unsubscribe(?:/(.+))?$ /unsubscribe.php?email=$1 [NC,L,QSA] 

問題是你的正則表達式這是首次匹配後的應用模式,做重寫的兩倍。