2011-03-14 61 views
1

我想了解爲什麼這個正則表達式不能在我的.htaccess文件中工作。我想要它,所以每當用戶去job_wanted.php?jid=ID,他們將被帶到job/ID在.htaccess文件中這個正則表達式有什麼問題?

這是怎麼回事?

RewriteEngine On 

RewriteCond %{QUERY_STRING} jid=([0-9]+) 
RewriteRule ^job_wanted\.php?$ job/%1? [R] 

我希望它這樣,當用戶點擊http://localhost/jobwehave.co.za/jobs/ID他們顯示了同樣的結果如下會有什麼表現http://localhost/jobwehave.co.za/jobs?id=ID

抱歉混淆。我仍然很困惑這是如何工作的。

+1

您的意思是說您希望用戶能夠鍵入類似'/ job/42'的RESTful URL,但是您的應用程序會將其視爲'job_wanted.php?jid = 42'? – 2011-03-14 14:25:55

+0

我認爲這就是我想要的。基本上這樣當用戶點擊像http://localhost/jobswehave/job_wanted.php?jid = 42這樣的鏈接時,url被重寫爲http:// localhost/jobswehave/job/4 – Aaron 2011-03-14 14:42:16

+0

嗯,這與我的評論相沖突。 **您希望用戶在其URL欄中看到哪種URL樣式?** – 2011-03-14 14:43:21

回答

2

主要問題是您無法將查詢字符串作爲RewriteRule的一部分進行匹配。您需要將該部分移至RewriteCond聲明中。

RewriteEngine On 
RewriteCond %{QUERY_STRING} jid=([0-9]+) 
RewriteRule ^job_wanted\.php$ /job/%1? 

編輯以反映您更新的問題,這與我在此處顯示的內容相反。對於反向,以/job/123轉換成你的PHP腳本可以消耗,你會想:

RewriteEngine On 
RewriteRule ^/job/([0-9]+)$ /path/to/job_wanted.php?jid=$1 

但你可能就要有麻煩把這個在.htaccess文件的任何地方,除了根,甚至可能那裏。如果它在根部工作,您可能需要從我在此處顯示的RewriteRule中刪除前導/

第二個編輯,以反映您的評論:我覺得你想要的是複雜的,但是這可能工作:

RewriteEngine On 
RewriteRule ^/job/([0-9]+)$ /path/to/job_wanted.php?jid=$1 [L] 

RewriteCond %{QUERY_STRING} jid=([0-9]+) 
RewriteRule ^job_wanted\.php$ http://host.name/job/%1? [R] 

你的根本問題是要「修復」現有的聯繫,大概是在你的控制。要更改瀏覽器地址欄中的網址,您必須重定向瀏覽器。沒有其他辦法可以做到這一點。

這就是第二條cond +規則的作用:它匹配傳入的舊URL並將其重定向到您漂亮的URL格式。這需要進入VirtualHost配置塊或位於與您的PHP腳本相同的目錄中的.htaccess文件中。

第一條規則恰恰相反:它將漂亮的URL轉換回Apache可以使用的東西,但是它使用內部的子請求,希望不會引發另一輪重寫。如果是這樣,你有一個無限循環。如果它工作,這將調用您的PHP腳本與作業ID的查詢字符串參數,您的頁面將一直工作。請注意,由於此規則假設不同的,可能不存在的文件系統路徑,它必須位於您的站點根目錄的VirtualHost塊或.htaccess文件中,即不同的位置

將配置分佈在不同的地方聽起來像是未來的問題,我不推薦它。我認爲你會更好地改變你的控制下的鏈接到漂亮的版本,而不用擔心其他鏈接。

+0

該OP向後反駁了這個問題。他想使用REST風格的URL。看看我的答案 - 我想我已經說得對(但我並不熟悉'mod_rewrite' ;-)。 – 2011-03-14 14:48:58

+0

仍然當我點擊一個本地主機/ jobswehave/job_wanted.php?jid = 42鏈接,它將我帶到本地主機/ jobswehave/job_wanted.php?jid = 42它不會使url看起來像localhost/jobswehave/jobs/42我有另一個rul所以當用戶去本地主機/ jobswehave /工作它顯示的結果localhost/jobswehave/jobs.php – Aaron 2011-03-14 15:07:47

+0

@Matthew,如果我明白你想完成什麼,我認爲你很困惑。重寫的一點是,不會看到像'localhost/jobswehave/job_wanted.php?jid = 42'這樣的鏈接。瀏覽器中的所有鏈接看起來都像'localhost/jobswehave/job/42'。 – 2011-03-14 15:38:50

1

你是否試圖逃避特殊字符(如?)?

+0

是的,我試圖用\ – Aaron 2011-03-14 14:39:09

1

?.字符在正則表達式中有特殊含義。你可能只需要逃避它們。

另外,您需要捕獲jid值並在規則中使用它。

嘗試改變你的規則是:

RewriteEngine On 
RewriteRule ^job_wanted\.php\?jid=([0-9]+)$ /job/$1 
+0

轉義它們'RewriteRule'不能匹配查詢字符串;請參閱http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule。 – 2011-03-14 14:43:11

1

你需要躲避?.馬克如果你想這些是文字。

^job_wanted\.php\?jid=9\?$ 

但雖然這解釋了爲什麼你的模式不匹配,它不能解決你的URL重寫問題。我也不確定爲什麼你要^$在那裏,因爲這會阻止它匹配大多數URL(例如,http://www.yoursite.com/job_wanted.php?jid=9不會工作,因爲它不會以job_wanted.php開頭)。

我不知道htaccess,所以我只能解決你的問題的正則表達式部分。在傳統的正則表達式語法,你會找這樣的事情:

s/job_wanted\.php\?jid=(\d*)/job\/$1/i 

希望有所幫助。

1

您尚未在正則表達式中捕獲到作業ID,因此您無法在重寫的URL中引用它。像這樣的東西(未測試,買者自負,可能會引起胃部不適等):

RewriteRule ^job/([0-9]+) job_wanted.php?jid=$1 

有關此的教程參見Start Rewriting

1

^將正則表達式錨定在字符串的開頭。

RewriteRule匹配URI 開始/(除非它在某個每個目錄配置區域中)。

無論前綴/或刪除錨點^(取決於你想要達到什麼目的)

+0

他說這是在一個'.htaccess'文件中,所以Apache將剝離導致包括'/'在內的目錄路徑。 – 2011-03-14 14:44:12

+0

在這種情況下,我錯了。 – 2011-03-14 14:46:19

1

喜歡的東西

ReWriteRule ^job\_wanted\.php\?jid\=([0-9-]+)$ /job/$1 

應該做的伎倆。

相關問題