Roberts Levandovskis pret Manuelu Noieru - Funny Read My Lips Challenge - Powered by 433

ES gribētu .htaccess novirzīt:

example.com/something_%26_else 

uz

example.com/something_%2526_else 

Es no MediaWiki importēju virkni lappušu, kuru nosaukumā ir dzeltens zīmes. Tie ir kodēti kā %26. Drupal dažādu iemeslu dēļ ir nolēmis dubultkodēt URL, lai tas kļūtu %2526. Es vienkārši nevaru izveidot aizstājvārdu Drupal, tāpēc man tas ir jāizmanto .htaccess.

Tas man ir līdz šim likums:

RewriteRule ^w/([^%26]+)\%26(.*)$ w/$1\%2526$2 [R=301] 

Šo jautājumu es uzdevu pirms trim mēnešiem vietnē StackOverflow, un es to nespēju panākt, lai tas darbotos. Es mēģināju šim nolūkam nolīgt darbuzņēmēju, bet nespēju to atrast. Tāpēc tas ir mans pēdējais grāvja darbs, pirms es pilnībā padodos. Es ļoti novērtēju palīdzību.

  • 1 iespējamais visa, ko jūs kādreiz gribējāt uzzināt par Mod_Rewrite noteikumiem, dublikāts, bet vai jums bija bail pajautāt?
  • 2 Pilnīgi godīgi sakot, vai nebūtu labāk, ja visi iesaistītie izpildītu UPDATE vaicājumu pret drupal datu bāzi, lai pārvērstu visus% 26 atpakaļ par ampersandiem, lai Drupal pārtrauktu to dubultkodēšanu?
  • @DerfK Tas pārtrauks saites no citām vietnēm. Tā kā ar šo problēmu ir apmēram 1000 lappušu, es vēlētos no tā izvairīties, bet, ja neatrodu risinājumu, tas man vienkārši ir jādara. Paldies

"noescape | NE" (nav URI izejas aizvēršanas)

Šis karodziņš neļauj mod_rewrite pārrakstīšanas rezultātam piemērot parastos URI aizbēgšanas noteikumus. Parasti īpašās rakstzīmes (piemēram, '%', '$', ';' un tā tālāk) tiks izspiestas to heksoda ekvivalentos (attiecīgi '% 25', '% 24' un '% 3B'); šis karogs neļauj tam notikt. Tas ļauj izvadē parādīties simboli procentos

mod_rewrite Dokumentācija vietnē Apache.org

Apskatiet manu atbildi (vietnē Drupal.SE) uz jautājumu "Kā izmantot noteikumu moduli, lai ieviestu pielāgotu novirzīšanu novecojušam URL?". Varu derēt, ka tur aprakstītais risinājums (izmantojot Noteikumu moduli) darbojas arī šajā gadījumā.

Kā sīki izklāstīts šajā atbildē: "pavediens", lai tas darbotos, ir izmantot Noteikumu notikumu "Drupal inicializē". Tas nodrošinās, ka kārtula tiek aktivizēta PIRMS faktiskā satura parādīšanas.

Man bija līdzīga problēma, kad mod &rewrite nepareizi pārrakstīja & &. B karogs to atrisināja:

B (aizbēgšanas atsauces) Karogs [B] uzdod RewriteRule izvairīties no burtciparu rakstzīmēm pirms transformācijas piemērošanas.

Tas man ļāva apkalpot failus, kuru nosaukumos ir “&”, piemēram, šeit

  • The B karogs ir raksturīgs atsauces, tāpēc tas, vai tas attiecas uz pašreizējo jautājumu, ir ļoti atkarīgs no izmantotās direktīvas / metodes.

Lai precizētu, %26 ir URL kodēts (jeb "% -kodēts") & (dzeltens).

Lai novirzītu a pieprasījumu priekš /something%26else burtiski (vai /something&else, tā kā ampersanda nav vajadzība jāizbēg URL ceļā) uz /something%2526else (ti. /something%26else atkodējot), jūs varētu darīt kaut ko līdzīgu:

RewriteRule ^(something)&(else)$ /$1\%26$2 [R,L] 

Vai arī vispārīgāks /%26:

RewriteRule (.*)&(.*) /$1\%26$2 [R,L] 

The RewriteRule modeli sakrīt ar% -decoded URL-path (ti. &, nevis %26). Tāpēc jums vienkārši jānorāda & (ampersanda) burtiski. Ņemiet vērā, ka tas atbildīs pieprasījumam abiem /something_%26_else un /something_&_else.

The % (procentos) RewriteRule aizstāšana ir jāaizbēg ar slīpsvītru, lai pārstāvētu burtisko %, pretējā gadījumā tas tiks uztverts kā atsauce uz pēdējo spēlēto CondPattern, un tādu nav, tāpēc %2 citādi kļūtu par tukšu virkni!

Bez NE (noescape) karodziņš, mod_rewrite automātiski kodēs aizstāšanas URL, kas faktiski ir tas, ko mēs šajā gadījumā vēlamies: %26 tiek kodēts kā %2526. (Atkodējot, to uzskata par burtiski %26.)


Alternatīvi, jūs varētu izmantot NE karodziņu (ko piemin @danlefree) un pēc tam manuāli kodēt aizstāšanu:

RewriteRule (.*)&(.*) /$1\%2526$2 [R,L,NE] 

Tomēr tas radīs problēmas, ja vietrādī URL ir citas% kodētas rakstzīmes (ja vien jūs neatbilstat burtiskajam vārdam "kaut kas" un "cits"), jo tās netiks kodētas atbildē.


Vēl viena alternatīva ir kodēts URL no THE_REQUEST servera mainīgais (kurā ir vietrādis URL, kāds tas parādās sākotnējā pieprasījumā) un vienkārši nododiet to aizstāšana kas pēc tam divreiz kodē mērķa URL (ja nav NE karogs):

RewriteCond %{THE_REQUEST} \s(.*\%26.*)\s RewriteRule & %1 [R,L] 

Pārbaudiet %26 nosacījums ir nepieciešams gadījumā, ja pieprasījumā tiek nosūtīts nekodēts "&" (lai novērstu novirzīšanas cilpu). The RewriteRule modeli & atbilst abiem & un %26 pieprasītajā URL ceļā (jo URL ceļš, kuram atbilst RewriteRule modeli ir pirmais URL dekodēts).

Šīs pieejas brīdinājums ir tāds, ka, ja pieprasītajā URL ir citas% kodētas rakstzīmes, tad arī tās tiks divreiz kodētas.

strādāja par jums: Charles Robertson | Vēlies ar mums sazināties?

noderīga informācija