2017-03-22 82 views
1

想從Apache重寫URL中的字符串 - 障礙是「?」在查詢

https://example.com/access/check?user=u-abc&pass=123 

改寫與給定用戶前綴(「U盤」)的URL到URL,而沒有前綴:

https://example.com/access/check?user=abc&pass=123 

我試了幾個規則,例如

RewriteBase/
RewriteRule ^access/check?user=u-(.*)$ check?user=$1 

我堅持用 「?」

IF重寫必須適用於輕微相同,但沒有,它的確作品「?」:

https://example.com/access/checkuser=u-abc&pass=123 

RewriteRule ^access/checkuser=u-(.*)$ checkuser=$1 

,並提供預期的結果(未經用戶前綴「U盤」)

checkuser=abc&pass=123 

我試圖匹配 「?」使用[?]或\ x3F,並按照mod_rewrite.org中所述應用QSA標誌,但仍未成功。

回答

2

查詢字符串不是RewriteRule模式的一部分

什麼是匹配?

  • ...
  • 如果你想對陣的主機名,端口或查詢字符串,分別使用的RewriteCond與%{HTTP_HOST}%{SERVER_PORT}或{%} QUERY_STRING變量。

所以你的情況,你必須覈對QUERY_STRING和使用替換%1代替$1

RewriteCond %{QUERY_STRING} user=u-(.*) 
RewriteRule ^access/check$ /access/check?user=%1 [L] 
+0

偉大的,工作對我來說,謝謝你的詳細解釋! – MarkHelms

2

匹配「?」這是一個查詢字符串,你需要一個RewriteCond,查詢字符串不能單獨與RewriteRule匹配。

根據定義,查詢字符串後的「?」的一切,你可以在一個重寫規則的目的使用它們,但與它們匹配您將需要的RewriteCond正如我剛纔提到的。

實施例:

RewriteCond %{QUERY_STRING} ^user=u-(.*) 
RewriteRule ^access/check check?user=%1 

注意捕獲從的RewriteCond基團被稱爲與%符號。

玩了一下簡單的例子,並嘗試了。

+0

致謝!只是爲了完成你的例子,以提供預期的輸出:RewriteRule^access/check access/check?用戶=%1 – MarkHelms

2

查詢字符串是不是比賽的一部分,規則的模式,你需要來匹配%{QUERY_STRING}使用的RewriteCond

RewriteEngine on 
RewriteCond %{QUERY_STRING} ^user=u-([^&]+)&pass=([^&]+)$ 
RewriteRule ^access/check/?$ /access/check/?user=%1&pass=%2 [L] 
+0

只有一個小故障,一個「/」太多,因此 - >重寫規則^訪問/檢查/?$ /訪問/檢查?用戶=%1和通過=%2 [L] – MarkHelms