Решение проблемы с кодировкой символов на сайте (UTF-8). Отображает иероглифы или знаки вопроса

Mám následující .htaccess kód:

RewriteRule ^Indian-Patriot-Name/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([^\x00-\x7F]+).*?$ indianpatriot.php?id=$1&lid=$2&name=$3 [B,L,QSA] 

Což mi umožňuje zobrazit výsledek následujícího odkazu:

example.com/Indian-Patriot-Name/104/8/ச்வடன்ற்யவீர்%20சவர்க்கார்%20రాష్ట్రీయ%20சமரக் 

Když však chci zobrazit následující adresu URL (nikoli unicode):

example.com/Indian-Patriot-Name/104/8/abcd 

Nemohu zobrazit výstup, protože se zobrazuje chyba „soubor nebyl nalezen“! Pokud však změním direktivu / regex na následující, mohu správně přečíst výše uvedenou (ne-unicode) adresu URL.

RewriteRule ^Indian-Patriot-Name-English/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)?$ indianpatriot.php?id=$1&lid=$2&name=$3 [L] 

Otázka Jak mohu kombinovat ([A-Za-z0-9-]+) a ([^\x00-\x7F]+) ve stejném přepisovacím prohlášení?

Zkusil jsem:

RewriteRule ^Indian-Patriot-Name-English/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([^\x00-\x7F]+)+([A-Za-z0-9-]+)?$ indianpatriot.php?id=$1&lid=$2&name=$3 [B,L,QSA] 

ale znovu se zobrazuje chyba „soubor nebyl nalezen“.


AKTUALIZACE: Zkusil jsem následující:

RewriteRule ^Indian-Patriot-Name-English/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([^\x00-\x7F]+ [A-Za-z0-9-]+)?$ indianpatriot.php?id=$1&lid=$2&name=$3 [B,L,QSA] 

Ale dostanu interní chybu serveru:

Interní chyba serveru Server narazil na interní chybu nebo nesprávnou konfiguraci a nemohl dokončit váš požadavek.

Kontaktujte správce serveru na adrese [email protected] a informujte jej o době, kdy k této chybě došlo, a o akcích, které jste provedli těsně před touto chybou.

Další informace o této chybě mohou být k dispozici v protokolu chyb serveru.

Při pokusu o použití ErrorDocument ke zpracování požadavku byla navíc zjištěna chyba 500 Interní chyba serveru.

  • Stejně jako u všech interních chyb zkontrolujte své logy, Apache vám tam řekne, co se děje (kromě toho, že hledal něco, co se zobrazí jako 500 ErrorDocument a nebylo nalezeno kvůli neplatné konfiguraci)
  • Také nerozumím vašemu problému. Nemůžete "kombinovat" ([A-Za-z0-9-]+) a ([^\x00-\x7F]+) protože něco, co odpovídá první specifikaci, se nemůže shodovat s druhou (znaky v první jsou skutečně v rozsahu \ x00- \ x7F, který chce druhá vyloučit)
  • dovolte mi předefinovat toto přepsání ([^ \ x00- \ x7F] +) funguje dobře. Jak mohu povolit A-Za-z0-9- také v ([^ \ x00- \ x7F] +)
  • 1 Stále mi to není jasné, ale zkuste to ([^\x00-\x7F]+|[A-Za-z0-9-]+)
  • dovolte mi to znovu definovat. "přepis ([^ \ x00- \ x7F] +)" funguje dobře pouze pro unicode. Chtěl bych povolit znakovou sadu A-Za-z0-9- v tomto přepisovacím příkazu, tj. Unicode a A-Za-z0-9 společně ve stejném přepisovacím příkazu
RewriteRule ^Indian-Patriot-Name-English/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([^\x00-\x7F]+ [A-Za-z0-9-]+)?$ indianpatriot.php?id=$1&lid=$2&name=$3 [B,L,QSA] 

Zobrazuje se mi interní chyba serveru ...

Máte chybu prostor v RewriteRule vzor. To bude mít za následek vaši „Interní chybu serveru“ od mezery jsou oddělovače ve směrnicích Apache. Pokud zkontrolujete svůj protokol chyb, pravděpodobně se od té doby zobrazí chyba týkající se „Neplatných příznaků“ indianpatriot.php?id... bude nyní považována za vlajky argument k RewriteRule směrnice.

Návrh @PatrickMevzek v komentářích však použít střídání vypadá to, jako by to mělo fungovat. Například:

RewriteRule ^Indian-Patriot-Name-English/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([^\x00-\x7F]+|[A-Za-z0-9-]+)?$ indianpatriot.php?id=$1&lid=$2&name=$3 [B,L,QSA] 

Všimněte si, že váš původní regulární výraz, který odpovídá URL unicode, měl na konci další vzor „chytit vše ostatní“: .*?. (Váš regulární výraz, který odpovídá adrese URL jiné než unicode, toto nemá.) Zdá se to neobvyklé. Pokud je to nutné, můžete jednoduše vynechat $ (konec ukotvení řetězce) od konce vzoru, aby provedl totéž.

Všimněte si také, že [^\x00-\x7F] je negován třída znaků, která odpovídá libovolnému znaku ne v rozsahu bajtů 00..7F (hex). Chcete-li začlenit latinskou abecedu, která spadá do tohoto rozsahu, můžete tento rozsah jednoduše rozšířit: [\x00-\xFF] - toto je nyní pozitivní rozsah, který odpovídá všemu (což je bezpochyby více, než potřebujete, ale pravděpodobně jste odpovídali více, než jste potřebovali s původním regulárním výrazem).

To by se však snad mohlo zjednodušit. Pokud se chcete jednoduše shodovat cokoliv (znaky Unicode nebo Latinské znaky) na konci adresy URL ([^\x00-\x7F]+|[A-Za-z0-9-]+) (nebo dokonce ([\x00-\xFF]+)) lze zjednodušit na ([^/]+) (tj. cokoli kromě lomítka). A pokud vám také nevadí shoda s podtržítkem, pak [A-Za-z0-9-] lze snížit na [\w-]. Tak se stává:

RewriteRule ^Indian-Patriot-Name-English/(\w-]+)/([\w-]+)/([^/]+)?$ indianpatriot.php?id=$1&lid=$2&name=$3 [B,L,QSA] 

Pracoval pro vás: Charles Robertson | Chcete nás kontaktovat?