簡體   English   中英

重寫動態URL

[英]Rewriting dynamic URLs

我試圖將1個動態URL重寫為另一個動態URL,如下所示;

/category?category=News to
/categorysearch/result/?q=news

我想知道是否有人知道如何在htaccess中完成這項工作?

謝謝。

所以最終的EDITED解決方案是(對於您鏈接的.htaccess):

RewriteCond %{REQUEST_FILENAME} ethical [NC]
RewriteCond %{QUERY_STRING} (^|&|%26|%20)ethical(=|%3D)([^&]+) [NC]
RewriteRule .* /catalogsearch/result/?q=%3 [L,R]

如果我使用當前問題中的“類別”術語:

RewriteCond %{REQUEST_FILENAME} category [NC]
RewriteCond %{QUERY_STRING} (^|&|%26|%20)category(=|%3D)([^&]+) [NC]
RewriteRule .* /categorysearch/result/?q=%3 [L,R]

但第一個更清楚,類別這個詞並不是隨處可見。 如果你想添加小寫轉換,我們甚至會做:

# outside of a Directory section
RewriteMap lowercase int:tolower
# in a Directory section (not a .htaccess)
RewriteCond %{REQUEST_FILENAME} category [NC]
RewriteCond %{QUERY_STRING} (^|&|%26|%20)category(=|%3D)([^&]+) [NC]
RewriteRule .* /catalogsearch/result/?q=${lowercase:%3} [L,R]

但正如評論這最后一個與tolower無法在.htaccess中工作 - 無論如何.htaccess很糟糕,真的,對於表演,你應該考慮設置AllowOverride None並將所有這些東西都移到VirtualHost中。 而像rewriteMaps這樣的好東西不能用於.htaccess文件。

所以現在我將解釋規則。 首先,你的情況的主要問題是“?”之后的一切 query_string ,而不是請求的文件名 大多數rewriteRules嘗試處理請求的文件名。 所以我首先檢查我們是否有針對性的問題文件名:

RewriteCond %{REQUEST_FILENAME} category [NC]

然后我們將處理查詢字符串(問號后面的所有內容)。 我們本可以編寫一些非常簡單的東西:

RewriteCond %{REQUEST_FILENAME} category [NC]
RewriteCond %{QUERY_STRING} ^category=(.+) [NC]
RewriteRule .* /catalogsearch/result/?q=${lowercase:%1} [L,R]

為了捕獲RewriteRule可用的變量%1之后的所有內容?category = 但QUERY_STRING參數有幾個問題,讓我們嘗試一下它的樂趣:

  • 尚未對此參數執行url解碼
  • category可能不是參數列表中的第一個參數
  • 它甚至可能不是最后一個(&foo = bar)
  • 你以前可以有一些空格

編輯

我的第一個答案是:

RewriteCond %{REQUEST_FILENAME} category [NC]
RewriteCond %{QUERY_STRING} [^|&|%26|%20][category](=|%3D)([^&]+) [NC]
RewriteRule .* /catalogsearch/result/?q=${lowercase:%2} [L,R]

隨着[^|&|%26|%20]捕獲事實,它可能是起始參數或&和空格后的參數, %26是&urlencoded。

但這是錯誤的 ,感謝@mootinator評論我已經檢查了一點,[類別]匹配'類別',但'atcatcategory'和這些字母的任意組合。

RewriteCond %{QUERY_STRING} category(=|%3D)([^&]+) [NC]

匹配'category'參數,刪除^允許將此參數放在任何位置。 但這也會匹配一個名為subcategory的參數。 所以第一個字母必須是空格或&(或查詢字符串的開頭)。

這就是[^|&|%26|%20] ,這意味着我開始鏈OR和/或空格或者在urlencoded中。 但這也是錯誤的^ []意味着否定。 所以我們需要在這里使用匹配的括號: (^|&|%26|%20) ,現在它可以工作,唯一的問題是參數的值現在是%3而不是%2

然后我們抓住(類別)單詞,確切地說我們應該事實上用大寫字母,小寫字母和urlencoded版本的字母大小寫一個字母,大寫字母,有點像awfull [c|C|%43|%63][a|A|%61|%41][t|T|%74|...]to be continued - 我應該使用括號而不是括號,地獄,檢查urlencoded字符列表

(=|%3D)是urlencoded與否的'='字符。 我本可以使用 [=|%3D]%3D在這種情況下不匹配,我不明白為什么(mod_rewrite是一個奇怪的東西) 由於使用了第一個匹配的括號,我們必須使用%2變量而不是%1。

然后我們有好的([^&]+) ,這意味着什么,但不是'&'。

在這些條件之后我們應用RewriteRule。 我們采取一切(這是.* )並將其重定向到/catalogsearch/result/?q=%2我們使用%3而不是$1$3因為我們不會在rewriteRule上捕獲任何內容但是在之前的條件( %3是最后一個條件的第三個捕獲數據,因此它是([^&]+) )。 如果在rewriteRule中添加QSA標志([L,R,QSA]),您甚至可以獲取最終查詢字符串上的其他參數,以便:

ethical?bar=toto& ethical=Foo&zorglub=titi 
=> is redirected to 
catalogsearch/result/?q=foo&bar=toto&%2520ethical=Foo&zorglub=titi

如果我玩一個小網址編碼:

ethical?bar=toto%26 ethical%3DFoo&zorglub=titi 
=> is redirected to 
catalogsearch/result/?q=foo&bar=toto%2526%2520ethical%253DFoo&zorglub=titi

但這不是劇本的結束,我會讓你處理所有你想要的urlencoding問題你想要檢測Foo值的所有變化並將它們與tolower混合(這里它已經壞了)。 您甚至可能在參數或額外屬性中沒有編碼網址的問題,但這很有趣:-)

根據您要做的事情以及具體事項的具體情況,有兩種選擇。

第一個是Rob W的解決方案,它應該將用戶從/category?category=News重定向到/categorysearch/result/?q=News

如果看起來像您的URL區分大小寫,那么您可能需要查看如下所示的PHP腳本:

$matches = array();
if( preg_match( "/^/category\?category=(.+)/", $_SERVER['REQUEST_URI'], $matches ) ) {
    header( 'Location: http://' . $_SERVER['HTTP_HOST'] . '/categorysearch/result/?q= . strtolower($matches[1]) );
}
else {
    //ERROR HANDLING
}

一旦確定,您可以使用類似以下的規則來使用完全小寫的參數進行重定向。

RewriteRule ^category\?category=(.+)$ redirect.php [L]

放在一起,這個解決方案會重定向/category?category=News to /categorysearch/result/?q=news

我認為

RewriteRule ^/category?category=(.*) /categorysearch/result/?q=news

會做的。

暫無
暫無

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

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