2013-05-05 71 views
1

尾隨期間,我有我的Apache的一個重寫規則,使網址友善mod_rewrite的在URL

RewriteRule ^log/(.+)$ script.php?u=$1 [QSA] 

這使得http://example.com/log/username得到內部重定向到http://example.com/script.php?u=username

這工作得很好,只要用戶名不包含一個尾隨時期。但是,有用戶名,人們選擇名字如「firstname-L」。 (注意尾隨期)

在這種情況下http://example.com/firstname-L。得到翻譯爲http://example.com/script.php?u=firstname-L(後期不見了)

我該如何得到這個工作?

+0

你是什麼意思檢查你的問題的拼寫。 – ncm 2013-05-05 09:57:45

+1

你可以嘗試一個明確的尾點像'^ log /(.+)\.$'這樣的規則嗎?它可能是刪除尾點的Apache Web服務器。 – Gumbo 2013-05-05 09:58:34

+1

不,它不是Apache,如果我輸入http://example.com/script.php?u=firstname-L。它工作正常。如果我在重定向頁面上打印$ _GET,那麼當我在http://example.com/script.php?u=firstname-L上這樣做時,尾部時間段會丟失。它在那裏 – 2013-05-05 10:35:03

回答

1

你可以嘗試檢查這些配置指令:

RewriteCond %{REQUEST_URI} !^/log/(.+)\.$ 
RewriteRule ^log/(.+)$ /script.php?u=$1 [QSA] 

RewriteCond %{REQUEST_URI} ^/log/(.+)\.$ 
RewriteRule ^log/(.+)$ /script.php?u=$1. [QSA] 

OR:

RewriteCond %{REQUEST_URI} ^/log/(.+)([a-zA-Z0-9_-]{1})$ 
RewriteRule ^log/(.+)$ /script.php?u=$1 [QSA] 

RewriteCond %{REQUEST_URI} ^/log/(.+)\.$ 
RewriteRule ^log/(.+)$ /script.php?u=$1. [QSA] 

我希望,我沒有記錯。現在,作爲用戶名與一個字符變量或一個帶尾隨字符的字符在第二個代碼中不起作用,我們可以嘗試用這個字符替換第二個代碼:

RewriteCond %{REQUEST_URI} ^/log/(.*)([a-zA-Z0-9_-]{1})$ 
RewriteRule ^log/(.+)$ /script.php?u=$1 [QSA] 

RewriteCond %{REQUEST_URI} ^/log/(.*)\.$ 
RewriteRule ^log/(.*)$ /script.php?u=$1. [QSA] 

或者你可以嘗試這三個襯墊指令,如果你不喜歡的四個襯墊:

RewriteCond %{REQUEST_URI} ^/log/(.*)\.$ 
RewriteRule ^log/(.*)$ /script.php?u=$1. [QSA] 
RewriteRule ^log/(.*)([a-zA-Z0-9_-]{1})$ /script.php?u=$1$2 [QSA] 

我希望,所有這些代碼上面會努力!

+1

那個工作,謝謝你。但是,這仍然是一個解決方法,我需要用四個替換每條規則(1行)。 – 2013-05-05 10:43:07

+0

@RainerMohr請檢查最新更新! – 5ervant 2013-05-05 10:53:32

+0

不行,在請求之前試過一個,期間不見了 – 2013-05-05 11:13:12

0

您的規則似乎是正確的,也許是客戶端或服務器剝離最後一個點爲假(上YT檢查Chrome瀏覽器,如果你在視頻的url(?=xxxxxxxxx?=xxxxxxxxx.),然後按回車結束加點,它會被刪除 - 實際上會觸發303 HTTP響應)。

一般來說,您只能在網址中使用大寫/小寫字母和非尾部破折號或點來組成所謂的slug,這可以保證在所有體面的瀏覽器和Web服務器上正確處理。