簡體   English   中英

.htaccess文件中的此正則表達式有什么問題?

[英]What's wrong with this regular expression in a .htaccess file?

我試圖了解為什么此正則表達式在我的.htaccess文件中不起作用。 我想要這樣,每當用戶轉到job_wanted.php?jid=ID ,他們就會被帶到job/ID

這怎么了

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

對不起,混淆了。 我還是很困惑這是如何工作的。

主要問題是您不能將查詢字符串作為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]

您的根本問題是您想“修復”現有鏈接,大概是無法控制。 為了更改瀏覽器地址欄中的URL,必須重定向瀏覽器。 沒有其他方法可以做到。

這就是第二個cond + rule的作用:它匹配傳入的舊URL並重定向到漂亮的URL格式。 這需要進入VirtualHost配置塊,或者進入與PHP腳本相同目錄的.htaccess文件。

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

在我看來,將配置散布到不同地方似乎是解決未來問題的良方,我不建議這樣做。 我認為最好將您控制下的鏈接更改為漂亮的版本,而不用擔心其他鏈接。

您是否嘗試過轉義特殊字符(例如? )?

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

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

嘗試將規則更改為此:

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

您需要逃脫? . 標記,如果您希望它們是文字。

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

但是,盡管這解釋了為什么模式不匹配,但是它不能解決URL重寫的問題。 我也不確定為什么要使用^$ ,因為那樣會阻止它匹配大多數URL(例如, http : //www.yoursite.com/job_wanted.php? jid =9無效,因為它不以job_wanted.php開頭)。

我不太了解htaccess,所以我只能解決您問題的正則表達式部分。 在傳統的regex語法中,您會尋找以下內容:

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

希望能有所幫助。

您尚未在正則表達式中捕獲作業ID,因此無法在重寫的URL中引用它。 諸如此類的事情(未經測試的警告購買者,可能會引起胃部不適等):

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

有關此內容的教程,請參見開始重寫

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

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

/加上前綴或刪除錨^ (取決於您要實現的目標)

就像是

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

應該可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM