主要問題是您無法將查詢字符串作爲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
文件中,即不同的位置。
將配置分佈在不同的地方聽起來像是未來的問題,我不推薦它。我認爲你會更好地改變你的控制下的鏈接到漂亮的版本,而不用擔心其他鏈接。
您的意思是說您希望用戶能夠鍵入類似'/ job/42'的RESTful URL,但是您的應用程序會將其視爲'job_wanted.php?jid = 42'? – 2011-03-14 14:25:55
我認爲這就是我想要的。基本上這樣當用戶點擊像http://localhost/jobswehave/job_wanted.php?jid = 42這樣的鏈接時,url被重寫爲http:// localhost/jobswehave/job/4 – Aaron 2011-03-14 14:42:16
嗯,這與我的評論相沖突。 **您希望用戶在其URL欄中看到哪種URL樣式?** – 2011-03-14 14:43:21