我嘗試在 httpd.conf 檔案中的 apache 網路服務器配置上撰寫重寫規則,該規則應將包含 &foo= 的每個 GET 引數鍵替換為 &poo= 但不應更改任何其他 GET 引數。例如:
https://test.com/imb/rs/search?test=abc&foo=123&test2=def&foo=456
應改為:
https://test.com/imb/rs/search?test=abc&poo=123&test2=def&poo=456
我試過了:
RewriteCond %{QUERY_STRING} ^(.*)&foo=(.*)$
RewriteRule ^(.*)$ $1?%1?&poo=%2 [NC]
但它只是將最后一次出現的 foo 更改為 poo。
我的 httpd.conf 檔案結構如下:
<Directory ~ "^/imb/rs/*">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
RewriteEngine on
RewriteCond %{QUERY_STRING} ^(.*)&foo=(.*)$
RewriteRule ^(.*)$ $1?%1&poo=%2 [NC]
</Directory>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{QUERY_STRING} ^(.*)&foo=(.*)$
RewriteRule ^(.*)$ $1?%1&poo=%2 [NC]
</IfModule>
撰寫 /imb/rs/ 部分是因為 url 以https://test.com/imb/rs/開頭并在此之后繼續。我認為這將符合我的情況。
有誰知道我該如何解決這個問題?
uj5u.com熱心網友回復:
<Directory ~ "^/imb/rs/*"> Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all RewriteEngine on RewriteCond %{QUERY_STRING} ^(.*)&foo=(.*)$ RewriteRule ^(.*)$ $1?%1&poo=%2 [NC] </Directory> <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{QUERY_STRING} ^(.*)&foo=(.*)$ RewriteRule ^(.*)$ $1?%1&poo=%2 [NC] </IfModule>
這里有幾個問題。<Directory>容器不會匹配請求,因此不會處理此容器內的 mod_rewrite 指令。僅處理容器外部的 mod_rewrite 指令<Directory>,但這只會替換查詢字串中的最后一個實體(因為正則運算式是貪婪的,并且重寫引擎只在 vHost/server 背景關系中進行一次傳遞)。&foo=
<Directory ~ "^/imb/rs/*">
您正在混合正則運算式和通配符語法。但是,這應該是一個絕對檔案系統路徑,而不是 URL 路徑,因為這似乎是(“url 以https://test.com/imb/rs/”開頭)。但是無論如何,您都不需要在<Directory>此處使用該指令的正則運算式版本。我假設/imb/rs是一個物理目錄,而不僅僅是一個虛擬 URL 路徑?
AllowOverride All
您正在顯式啟用.htaccess覆寫。如果您.htaccess在此目錄中確實有一個包含 mod_rewrite 指令的檔案,那么這將完全覆寫<Directory>服務器配置中的容器。您可能應該.htaccess完全禁用覆寫。
Order allow,deny Allow from all
這些是 Apache 2.2 指令,以前在 Apache 2.4 上已棄用(我假設您正在使用它)。您應該改用等效的Require all granted。(但您確實需要確保始終使用 Apache 2.4 指令 - 不要將兩者混用。)
Options Indexes FollowSymLinks
旁白:您是否有意允許 mod_autoindex 生成您的內容的目錄串列?通常,這應該被禁用(即Indexes從該規則中洗掉)。
請嘗試以下操作:
<Directory "/absolute/file/path/to/imb/rs">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
RewriteEngine On
RewriteCond %{QUERY_STRING} (.*)&foo=(.*)
RewriteRule (.*) $1?%1&poo=%2 [L]
</Directory>
并從<Directory>容器外部洗掉規則。
所以,你一開始的規則基本沒問題。此處不需要字串開頭和結尾錨點,因為正則運算式是greedy。該NC標志不是必需的。該L標志不是嚴格要求的,但如果您稍后添加更多規則則需要。
uj5u.com熱心網友回復:
我發現這個解決方案只適用于 1 次,而不適用于多次。
這個只需要第一次出現:
RewriteCond %{QUERY_STRING} (.*?)foo(.*) [NC]
RewriteRule ^ %{REQUEST_URI}?%1poo%2 [NC]
這個只需要最后一次出現:
RewriteCond %{QUERY_STRING} (.*)foo(.*) [NC]
RewriteRule ^ %{REQUEST_URI}?%1poo%2 [NC]
但我找不到替換所有這些的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/437241.html
上一篇:PHP寫權限被拒絕
