2010-06-14 39 views
2

我想要做的事情: 的格式爲'http://domain.tld/one/two/three',它可以通過查看REQUEST_URI服務器變量來處理PHP腳本(index.php)。
在我的例子中,REQUEST_URI是'/ one/two/three'。 (順便說一句,這是一個好主意嗎?)mod_rewrite:不是?和#在REQUEST_URI

我正在使用Apache的mod_rewrite來實現這一點。
這是我在我的.htaccess使用重寫規則:

RewriteRule ^/?([a-zA-Z/]+)/?$ /index.php [NC,L]

這個作品真的很好迄今;它會將每個由a-z,A-Z或'/'組成的REQUEST_URI轉發到/index.php,在那裏處理它。

唯一的缺點:'?' (問號)和'#'(散列鍵)在REQUEST_URI中似乎仍然被允許,可能還有更多的字符我還沒有找到。
是否有可能通過我的.htaccess限制那些和RewriteRule的充分的補充?

謝謝!

回答

1

片段標識符,例如#some-anchor,由瀏覽器控制,而不是服務器。 JavaScript將需要重定向和刪除這個,雖然爲什麼你想這樣做,我不知道。

[澄清後剪斷] 要重寫只有當查詢字符串爲空:

RewriteCond %{QUERY_STRING} ^$ 
RewriteRule ^/?([a-zA-Z/]+)/?$ /index.php [NC,L] 
+0

我明白了,讓我們忘掉#然後它不是一個大問題,但是'?'有點困擾我。有沒有辦法不重寫包含'?'的REQUEST_URIs?有人提到(現在刪除了他的答案)來檢查一個空的QUERY_STRING,這聽起來像一個好主意,但沒有工作,也許我做錯了? 我試過了你的建議,但那沒有做任何事情。謝謝。 – tshabala 2010-06-14 10:39:31

+0

@tshabala The?在index.php的結尾刪除查詢字符串。我已經用信息更新了我的答案 – Cez 2010-06-14 11:02:38

+0

@tshabala我已經添加到我的答案中,因爲我發現了你的意思 – Cez 2010-06-14 11:13:39

0

$_SERVER['REQUEST_URI']變量將包含原REQUEST_URI服務器所接收,在執行重寫之前。因此,從REQUEST_URI的屬性中刪除查詢字符串部分是不可能的(就我所知,這很早),但當您在腳本中處理$_SERVER['REQUEST_URI']變量時,您自然可以選擇將其刪除。

如果你想只執行你的重寫規則沒有指定的查詢字符串時,下面應該工作:

RewriteCond %{QUERY_STRING} !^.+$ 
RewriteRule ^/?([a-zA-Z/]+)/?$ /index.php [NC,L] 

注意,這可能是有問題的,雖然,因爲如果有意外的URL查詢字符串有人使用鏈接到您的網站,您的腳本將不會處理它(因爲重寫從不發生),所以他們會得到一個404響應(或任何情況下可能),可能不像用戶友好如果您剛剛選擇默默忽略尾隨信息。

0

如果我明白了,你想禁止使用?和#爲您的網站?

你不應該這樣做,因爲:(?)

因此,如果您強制Apache拒絕包含問號的網址請求,則在AdWords中點擊您的廣告的用戶只會看到404錯誤頁面。

讓人們使用它們並沒有什麼不好。這種情況是爲了防止您的網站對XSS攻擊。

Btw。另外還有一個很importand符號 - 百分號(%)這是用於編碼特殊字符(如波蘭或德國國家信訪局)

1

在mod_rewrite的和PHP變量REQUEST_URI是指兩個different part of the URI。在mod_rewrite中,%{REQUEST_URI}包含當前的URI路徑;在PHP中,$_SERVER['REQUEST_URI']包含URI路徑和查詢。但是在這兩種情況下,作爲這部分URI的URI片段都不會被傳輸到服務器,而只會被客戶端使用。

所以,當請求/one/two/three?foo#bar,mod_rewrite的的%{REQUEST_URI}包含/one/two/three和PHP的$_SERVER['REQUEST_URI']包含/one/two/three?foo