2017-07-27 52 views
1

我有一個會像的.htaccess替換URL參數「名稱」

http://example.com/shake/pokladna/?id=35601-JILOSRO&name=Jilo%20s.r.o.&address=Hrušková%202194&city=Sokolov&zipcode=35601 

我想重定向地址,這些(我需要更換「名」與「name_gls」)

一個網址
http://example.com/shake/pokladna/?id=35601-JILOSRO&name_gls=Jilo%20s.r.o.&address=Hrušková%202194&city=Sokolov&zipcode=35601 

代碼無效鏈接。

RewriteCond %{QUERY_STRING} (.*)&?name=(.*)? [NC] 
RewriteRule ^pokladna/?$ $0?%1name_gls=%2 [R=301,L] 
+0

你把這些代碼放在哪裏?網址參數是否有所不同? 'name'總是_internal_ URL參數嗎?或者它也可能出現在查詢字符串的開頭? – MrWhite

+0

我將該代碼放入.htaccess。是的,網址參數有所不同。第三方API讓我回到這些參數。我不確定未來是否不會改變。 –

+0

但是'.htaccess'文件在哪裏?我假定它是文檔根目錄下的'.htaccess'文件,但是,你的代碼表明它在'/ shake'子目錄中?這可能是故意的,但是,它也可能是一個錯誤? – MrWhite

回答

0
RewriteCond %{QUERY_STRING} (.*)&?name=(.*)? [NC] 
RewriteRule ^pokladna/?$ $0?%1name_gls=%2 [R=301,L] 

這是接近,但不完全正確。如上所述,這些指令位於位於/shake/.htaccess的WordPress .htaccess文件中。這些指令需要在之前,如果還沒有的話。

RewriteRule替代需要一個斜槓前綴進行有效的外部重定向在每個目錄.htaccess文件。按照現狀,$0反向引用排除了斜槓前綴,因此導致相對路徑替換 - 在這種情況下,目錄前綴被添加回去,導致無效的重定向。

另一個潛在的問題是在CondPattern,即可選&&?(.*)&?name=(.*)?。在給定的示例URL上,這將工作正常,但是,由於前面的(.*)貪婪,這也將匹配任何查詢字符串參數名稱,只是以「名稱」結尾。例如,形式爲id=123&anothername=foo的查詢字符串將更改爲id=123&anothername_gls=foo - 我懷疑是否可取。解決這個問題的方法是使用替代,例如。 (^|.+&)以匹配查詢字符串之前的URL參數(和參數分隔符)。

我也會質疑RewriteCond指令中NC標誌的使用 - 這是否應該是不區分大小寫的匹配?

並且您已將URL路徑上的尾部斜線設置爲可選。這真的是可選的嗎?如果是,那麼你應該確保這是替代規範化。在下面的代碼中,我假設尾部的斜槓是強制性的,因爲它在您的示例中存在。

有了您的具體的例子,你還需要NEnoescape)標誌,以防止在查詢字符串中的%編碼空間(即%20)是雙重編碼。

所以,把這些點就是,你可以試試,而不是執行以下操作:

RewriteCond %{QUERY_STRING} (^|.+&)name=(.*) 
RewriteRule ^pokladna/$ /$0?%1name_gls=%2 [NE,R,L] 

注意,這是一個臨時的(302)重定向。只有當你確定它工作正常時,才能將R更改爲R=301。永久重定向可能會使測試出現問題,因爲它們被瀏覽器強制緩存。

因此,在測試之前,您需要確保瀏覽器緩存清除。

而且,正如上面提到的,這些都要前現有的WordPress指令(具體地,之前前端控制器)。