Поради щодо налагодження правил перезапису .htaccess


272

У багатьох плакатів виникають проблеми з налагодженням своїх RewriteRule та RewriteCond висловлювань у своїх .htaccessфайлах. Більшість із них використовують спільний сервіс хостингу, тому не мають доступу до конфігурації кореневого сервера. Вони не можуть уникнути використання .htaccessфайлів для переписування і не можуть увімкнути RewriteLogLevel ", як багато респондентів пропонують. Також є багато .htaccessспецифічних підводних каменів, а обмеження недостатньо покриті. Налаштування локального стека тестів LAMP передбачає занадто багато кривої навчання для більшості .

Так мій Q ось як би ми рекомендуємо , щоб вони налагоджувати свої правила самі . Я надаю кілька пропозицій нижче. Інші пропозиції будуть вдячні.

  1. Зрозумійте, що двигун mod_rewrite циклізує .htaccessфайли . Двигун виконує цю петлю:

    do
      execute server and vhost rewrites (in the Apache Virtual Host Config)
      find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled
      if found(.htaccess)
         execute .htaccess rewrites (in the user's directory)
    while rewrite occurred
    

    Тож ваші правила виконуватимуться неодноразово, і якщо ви зміните шлях URI, то вони можуть закінчити виконання інших .htaccessфайлів, якщо вони існують. Тому переконайтеся, що ви припините цю петлю, якщо потрібно, додавши додаткові, RewriteCondщоб зупинити правила запуску. Також видаліть будь-які .htaccessнабори правил перезапису нижчого рівня, якщо явно не має наміру використовувати багаторівневі набори правил.

  2. Переконайтесь, що синтаксис кожного Regexp правильний , перевіряючи набір тестових шаблонів, щоб переконатися, що це правильний синтаксис, і виконує те, що ви задумали, з повним діапазоном тестових URI. Дивіться відповідь нижче для отримання більш детальної інформації.

  3. Поступово будуйте свої правила в тестовому каталозі. Ви можете скористатися "виконати найглибший .htaccessфайл на функції шляху", щоб створити тут окремий тестовий каталог (дерево) та набори правил налагодження, не викручуючи основні правила та не припиняючи роботу вашого сайту. Ви повинні додавати їх по черзі, тому що це єдиний спосіб локалізації відмов окремих правил.

  4. Використовуйте фіктивний скрипт для скидання змінних сервера та середовища . (Див. Лістинг 2 ) Якщо ваша програма використовує, скажімо, blog/index.phpви можете скопіювати це test/blog/index.phpі скористатися ним, щоб перевірити правила свого блогу у testпідкаталозі. Ви також можете використовувати змінні середовища, щоб переконатися, що механізм перезапису в інтерпретації рядків заміни правильно, наприклад

    RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
    

    і шукайте ці змінні REDIRECT_ * на дампі phpinfo. До речі, я скористався цим і виявив на своєму сайті, що мені довелося використовувати його %{ENV:DOCUMENT_ROOT_REAL}замість цього. У разі циклічного перенаправлення перемінника REDIRECT_REDIRECT_ * змінні відображають попередній пропуск. І т.д.

  5. Переконайтеся, що вас не покусає кешування браузера неправильним перенаправленням 301 . Дивіться відповідь нижче . Моя вдячність Ульріха Palha для цього.

  6. Двигун перезапису здається чутливим до каскадних правил у .htaccessконтексті (саме там RewriteRuleрезультати призводять до заміни, і це потрапляє, хоча й до подальших правил), оскільки я виявив помилки з внутрішніми підзапитими (1) та неправильною обробкою PATH_INFO, яка часто може не допускати використання прапорів [NS], [L] та [PT].

Ще коментар чи пропозиції?

Лістинг 1 - phpinfo

<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);

10
Це добре ... Можливо, вам слід перенести їх із питання у відповідь.
w00t

@ w00t, я розділив перевіряльник regexp відповідно до вашої пропозиції, тому що я хочу посилатися на це за посиланням в інших відповідях.
TerryE

3
Ви можете додати схему потоку управління з документів до першої пропозиції. ІМО набагато простіше зрозуміти, ніж будь-який псевдокод чи пояснення, і це справді найчорніша частина мод-переписати вуду.
SAT

Число 6 - це величезна справа. Перепишіть правила, що поводяться по-різному в стандартних файлах конфігурації apache порівняно з.
Ієн Коллінз

Щось, що, можливо, варто додати до цих підказок: я витратив деякий час налагодження проблеми з переадресацією, а не переписуванням. Виявляється, я його переписав на "/ коментувати", коли захотів "/ коментувати /". Він переписувався на "/ коментар", а потім сервер робив переспрямування на "/ коментар /". Очевидна поведінка до тих, хто звик до Apache, але, мабуть, менше, ніж для ноб, як я.
Кріс

Відповіді:


132

Ось кілька додаткових порад щодо правил тестування, які можуть полегшити налагодження для користувачів на спільному хостингу

1. Використовуйте агент із підробленими користувачами

Під час тестування нового правила додайте умову виконувати його лише з fakeкористувальницьким агентом, який ви будете використовувати для своїх запитів. Таким чином це не вплине на когось іншого на вашому сайті.

напр

#protect with a fake user agent
RewriteCond %{HTTP_USER_AGENT}  ^my-fake-user-agent$
#Here is the actual rule I am testing
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC] 
RewriteRule ^ http://www.domain.com%{REQUEST_URI} [L,R=302] 

Якщо ви використовуєте Firefox, ви можете використовувати перемикач агентних агентів для створення підроблених рядків і тестування агента користувача.

2. Не використовуйте 301, поки не закінчите тестування

Я бачив стільки постів, де люди все ще тестують свої правила, і вони використовують 301. НЕ ДАЙТЕ .

Якщо ви не використовуєте пропозицію 1 на своєму сайті, 301 буде впливати не тільки ви, а й кожен, хто відвідує ваш сайт.

Пам’ятайте, що вони є постійними та агресивно кешовані вашим браузером. Використовуйте натомість 302, поки не будете впевнені, а потім змініть його на 301.

3. Пам’ятайте, що 301-ті агресивно кешуються у вашому браузері

Якщо ваше правило не працює, і воно вам здається правильним, і ви не використовували пропозиції 1 і 2, повторіть тест після очищення кешу веб-переглядача або під час приватного перегляду.

4. Використовуйте інструмент захоплення HTTP

Використовуйте інструмент захоплення HTTP, як Fiddler, щоб побачити фактичний трафік HTTP між вашим браузером та сервером.

Хоча інші можуть сказати, що ваше site does not look right, ви могли замість цього побачити та повідомити про це all of the images, css and js are returning 404 errors, швидко звузивши проблему.

У той час як інші повідомлять, що ви started at URL A and ended at URL C, ви зможете побачити, що вони почали URL A, were 302 redirected to URL B and 301 redirected to URL C. Навіть якщо кінцева мета була URL-адресою C, ви знаєте, що це погано для SEO та його потрібно виправити.

Ви зможете побачити заголовки кешу, встановлені на стороні сервера, відтворити запити, змінити заголовки запитів для тестування ....



9
Ульріх, велике спасибі за цей внесок. Ви підібрали деякі аспекти, які я не думав внести у свій список. У питанні налагодження 301 я використовую Chrome у режимі приватного перегляду (AKA "Порно-режим"), оскільки це скидає цю інформацію про стан, коли ви закриваєте вікно. Я сподіваюся, що ви не заперечуєте проти того, що я не "сприймаю" це як важливий момент, але не єдину найкращу відповідь. Знову дякую. :)
TerryE

1
Щоб було зрозуміло (у вас його є у вашому коді, але ви його не помітили), але щоб переконатися, що ви використовуєте переспрямування 302 не 301, яке вам потрібно[L,R=302]
icc97

6
Вам не потрібно чітко вказувати [L, R=302]лише робити [L,R]за замовчуванням302
Рахіль Вазір

2
@goodeye, також перегляньте прапорець "Chrome> Налаштування> Загальне> Вимкнути кеш, поки DevTools відкритий".
johnsnails

83

Інтернет .htaccess переписувати тестування

Я знайшов цю допомогу в Googling для RegEx, це врятувало мені багато часу від необхідності завантажувати нові .htaccessфайли щоразу, коли я роблю невелику модифікацію.

з сайту:

тестер htaccess

Щоб перевірити свої правила перезапису htaccess, просто заповніть URL, до якого ви застосовуєте правила, розмістіть вміст свого htaccess на більшій області введення та натисніть кнопку "Перевірити зараз".


6
Дякую за вказівник на цей інструмент, який я знайшов найбільш прямий спосіб налагодити свою проблему.
BobHy

Якщо у вас є ssh доступ до веб-простору, інший варіант - змінити .htaccess безпосередньо через редактор на сервері.
sjas

Вам потрібно буде ігнорувати ssl попередження b / c щодо сертифікатів сайтів. Але сайт все-таки є. Це найкраще і найпростіше рішення. Це дає неймовірне розуміння того, що не так, і призводить до виправлення проблеми ШВИДКО.
toddmo

Дякуємо, що вказали на цей інструмент. Це корисно, Іноді налагодження апата-хтачсеса дуже прокляте важко. Дякую. Велика подяка
Benyamin Limanto

Здається, посилання є помилковим і не завжди дає точний вихід. Будь ласка, перевірте фактичний апаш, щоб бути абсолютно впевненим.
Parth

13

Не забувайте, що у файлах .htaccess це відповідна URL-адреса.

У файлі .htaccess такі RewriteRule ніколи не збігаються:

RewriteRule ^/(.*)     /something/$s

4
Так, рядок, що подається в правило перезапису, є відносним і тому позбавлений будь-яких ведучих /, але ця зачистка не відбувається для рядків збігу, зібраних у команди Rewrite Cond .
TerryE

8

Переконайтесь, що синтаксис кожного Regexp правильний

перевіряючи набір тестових шаблонів, щоб переконатися, що це правильний синтаксис, і виконує те, що ви задумали, з повним діапазоном тестових URI.

Див. RegexpCheck.php нижче простий сценарій, який ви можете додати до приватного / тестового каталогу на своєму сайті, щоб допомогти вам це зробити. Я дотримувався цього стислого, а не гарного. Просто перенесіть це у файл regexpCheck.phpу тестовому каталозі, щоб використовувати його на своєму веб-сайті. Це допоможе вам створити будь-який повторний випробування та протестувати його зі списком тестових випадків. Я тут використовую двигун PHP PCRE, але, ознайомившись з джерелом Apache, це в основному ідентично тому, яке використовується в Apache. Є багато HowTos та навчальних посібників, які надають шаблони та можуть допомогти вам сформувати свої навички regexp.

Лістинг 1 - regexpCheck.php

<html><head><title>Regexp checker</title></head><body>
<?php 
    $a_pattern= isset($_POST['pattern']) ? $_POST['pattern'] : "";
    $a_ntests = isset($_POST['ntests']) ? $_POST['ntests'] : 1;
    $a_test   = isset($_POST['test']) ? $_POST['test'] : array();
    
    $res = array(); $maxM=-1; 
    foreach($a_test as $t ){
        $rtn = @preg_match('#'.$a_pattern.'#',$t,$m);
        if($rtn == 1){
            $maxM=max($maxM,count($m));
            $res[]=array_merge( array('matched'),  $m );
        } else {
            $res[]=array(($rtn === FALSE ? 'invalid' : 'non-matched'));
        }
    } 
?> <p>&nbsp; </p>
<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME'];?>">
    <label for="pl">Regexp Pattern: </label>
    <input id="p" name="pattern" size="50" value="<?php echo htmlentities($a_pattern,ENT_QUOTES,"UTF-8");;?>" />
    <label for="n">&nbsp; &nbsp; Number of test vectors: </label>
    <input id="n" name="ntests"  size="3" value="<?php echo $a_ntests;?>"/>
    <input type="submit" name="go" value="OK"/><hr/><p>&nbsp;</p>
    <table><thead><tr><td><b>Test Vector</b></td><td>&nbsp; &nbsp; <b>Result</b></td>
<?php 
    for ( $i=0; $i<$maxM; $i++ ) echo "<td>&nbsp; &nbsp; <b>\$$i</b></td>";
    echo "</tr><tbody>\n";
    for( $i=0; $i<$a_ntests; $i++ ){
        echo '<tr><td>&nbsp;<input name="test[]" value="', 
            htmlentities($a_test[$i], ENT_QUOTES,"UTF-8"),'" /></td>';
        foreach ($res[$i] as $v) { echo '<td>&nbsp; &nbsp; ',htmlentities($v, ENT_QUOTES,"UTF-8"),'&nbsp; &nbsp; </td>';}
        echo "</tr>\n";
    }
?> </table></form></body></html>

1
Швидка примітка: import_request_variablesбула знята з використання в PHP 5.3 та видалена в 5.4. extract($_GET)у поєднанні з extract($_POST)може виконувати ту саму функцію, але всі змінні потребують префікса, видаленого з їх імені. Джерело: php.net/manual/en/function.import-request-variables.php
Джефф Ламберт

@watcher, спасибі Я оновив свою локальну версію на 5.4 сумісні рік тому, але забув змінити цю публікацію. Зараз зроблено.
TerryE

ой, навіть після редагування, не вдасться отримати хороших результатів, просто скопіювавши свій код ... але з реджекс-скрипками навколо, я вважаю, що ваш інструмент все-таки застарів. перегляньте ці класні інструменти: regex101.com або refiddle.com або regexr.com
програмне забезпечення для

@hexereisoftware, цій посаді 3 роки, тому можуть виникнути тонкі проблеми залежно від версії PHP, яка зараз використовується, та версії Apache. Однак існує багато варіантів регулярного виразів з кожним із тонких відмінностей. Як я вже казав, в коді Apache використовується двигун PCRE, який дуже схожий на механізм PHP. Я не впевнений, що відрізняється від інших варіантів, таких як .Net, так що, хоча ваша пропозиція використовувати Інтернет-ресурс є гарною, я б дотримувався того, який явно підтримує синтаксис apache або PHP. :-)
TerryE

Perl буде найближчим, але php використовує той самий синтаксис
програмне забезпечення для шестигранника

7

Переконайтеся, що ви використовуєте знак відсотка перед змінними, а не знаком долара.

Це %{HTTP_HOST}, ні ${HTTP_HOST} . У журналі error_log нічого не буде, внутрішніх помилок сервера не буде, ваш regexp все ще правильний, правило просто не збігатиметься. Це справді огидно, якщо ви багато працюєте з шаблонами джанго / генші і маєте ${}можливість мінливої ​​заміни в м'язовій пам'яті.


1
Так, змінні $ заміщення стосуються останнього шаблону RewriteRule, а % відносяться до останнього шаблону RewriteCond та спеціальних подій, таких як% {env: XXX}
TerryE

7

Один з кількох годин, які я марнув:

Якщо ви застосували всі ці поради та збираєтесь лише з 500 помилками, оскільки у вас немає доступу до журналу помилок сервера, можливо, проблема полягає не в .htaccess, а у файлах, на які він перенаправляється.

Після того як я виправив свою проблему .htaccess, я витратив ще дві години, намагаючись виправити її ще трохи, хоча я просто забув про деякі дозволи.


Я використовую веб-службу хостингу з спільним доступом для мого особистого сайту, але те, що я зробив, - це створити тестову VM, яка приблизно відображає це з точки зору конфігурації PHP / Apache, домашнього каталогу та ін. Адміністратор Я можу включити перезапис журналу, щоб діагностувати будь-які складні .htaccessпроблеми.
TerryE

6

Встановіть змінні середовища та використовуйте заголовки для їх отримання:

Ви можете створити нові змінні середовища за допомогою рядків RewriteRule, як зазначено в OP:

RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]

Але якщо ви не можете змусити серверний скрипт працювати, як тоді можна прочитати цю змінну середовища? Одне рішення - встановити заголовок:

Header set TEST_FOOBAR "%{REDIRECT_TEST0}e"

Значення приймає специфікатори формату , включаючи %{NAME}eспецифікатор змінних оточуючих середовищ (не забувайте про малі регістри e). Іноді вам потрібно буде додати REDIRECT_префікс, але я не працював, коли префікс додається і коли він не відбувається.


Ви отримали подальше розуміння, коли слід використовувати або не використовувати REDIRECT_префікс? Також я бачу термінологію щодо префіксів і в інших (htaccess) контекстах, але ніколи не було зрозуміло, що саме означає. Чи означає це, що ви повинні назвати свою змінну за допомогою префікса або додати префікс до названої змінної під час використання певних команд (але не інших команд)? Ваш приклад перший, який показує як визначення var, так і використання var, тому з цього я схильний думати останній! Документи мало допомагають - вони припускають, що ми знаємо занадто багато, і дають занадто мало посилань / посилань.
SherylHohman

5

Якщо ви створюєте переадресації, протестуйте завиток, щоб уникнути проблем із кешуванням браузера. Використовуйте -I лише для отримання заголовків http. Використовуйте -L, щоб дотримуватися всіх переадресацій.


3

Я знайшов це питання під час спроби налагодити свої проблеми з mod_rewrite, і воно, безумовно, має корисні поради. Зрештою, найважливіше - це переконатися, що ви правильний синтаксис регулярного виразу. Через проблеми з моїм власним синтаксисом RE, встановлення сценарію regexpCheck.php було непридатним варіантом.

Але оскільки Apache використовує регулярні вирази, сумісні з Perl (PCRE), будь-який інструмент, який допомагає писати PCRE, повинен допомогти. У минулому я використовував інструмент RegexPlanet з Java і Javascript RE і радий виявив, що вони також підтримують Perl.

Просто введіть регулярний вираз та одну чи більше прикладних URL-адрес, і він підкаже, чи відповідає регулярний вираз («1» у стовпці «~ =») і, якщо це застосовно, будь-які відповідні групи (цифри у розділі «розділити» стовпець буде відповідати цифрам, які очікує Apache, наприклад, $ 1, $ 2 тощо) для кожної URL-адреси. Вони стверджують, що підтримка PCRE "знаходиться в бета-версії", але це було саме те, що мені потрібно було вирішити мої проблеми з синтаксисом.

http://www.regexplanet.com/advanced/perl/index.html

Я просто додав би коментар до існуючої відповіді, але моя репутація ще не на такому рівні. Сподіваюся, що це комусь допоможе.


приємний інструмент, але жахлива форма ... перевірте ці класні інструменти: regex101.com або refiddle.com або regexr.com
програмне забезпечення для

3

Щодо 4., ви все ще повинні переконатися, що ваш "фіктивний скрипт" фактично є цільовою URL-адресою після того, як все перезапис буде зроблено, інакше ви нічого не побачите!

Подібний / пов’язаний фокус (див. Це питання ) полягає в тому, щоб вставити тимчасове правило, таке як:

RewriteRule (.*) /show.php?url=$1 [END]

Де show.phpє дуже простий сценарій, який просто відображає його$_GET параметри (ви можете також відображати змінні середовища, якщо хочете).

Це зупинить перезапис у точці, коли ви вставите його в набір правил, швидше, як точка розриву в налагоджувачі.

Якщо ви використовуєте Apache <2.3.9, ви повинні будете використовувати , [L]а не [END], і ви , можливо , після цього потрібно додати:

RewriteRule ^show.php$ - [L]

У верхній частині вашого набору правил, якщо URL-адреса /show.phpсама переписується.


3

Деякі помилки, які я спостерігав, трапляються під час написання .htaccess

Повторне використання ^(.*)$в декількох правилах із застосуванням ^(.*)$призводить до того, що інші правила в більшості випадків виявляються безсилими, оскільки вони відповідають усім URL-адресам в одному зверненні.

Отже, якщо ми використовуємо правило для цієї URL-адреси, sapmle/urlвоно також буде споживати цю URL-адресу sapmle/url/string.


[L] прапор слід використовувати для того, щоб переконатися, що наше правило виконало обробку.


Слід знати про:

Різниця у% n та $ n

%nузгоджується під час %{RewriteCond}частини і $nзбігається на %{RewriteRule}частину.

Робота з RewriteBase

Директива RewriteBase вказує префікс URL, який буде використовуватися для директив RewriteRule per-directory (htaccess), які замінюють відносний шлях.

Ця директива потрібна, коли ви використовуєте відносний шлях для підстановки в контексті per-directory (htaccess), якщо не виконується будь-яке з наступних умов:

Оригінальний запит і заміна знаходяться під DocumentRoot (на відміну від доступного іншими способами, наприклад, псевдонімом). Шлях файлової системи до каталогу, що містить RewriteRule, суфікс відносної заміни, також дійсний як шлях до URL на сервері (це рідко). В Apache HTTP Server 2.4.16 і пізніших версій ця директива може бути пропущена, коли запит відображається через Alias ​​або mod_userdir.


2

Якщо ви плануєте писати більше ніж один рядок правил у .htacesss,
навіть не думайте про те, щоб спробувати один із цих методів гарячої виправлення, щоб налагодити його.

Я витрачав дні, встановлюючи кілька правил, без зворотного зв'язку з ЛОГами, лише щоб нарешті відмовитись.
Я отримав Apache на свій ПК, скопіював весь сайт на його жорсткий диск, і весь набір правил сортував, використовуючи журнали, реально швидко.
Потім я переглянув свої старі правила, які працювали. Я бачив, що вони насправді не роблять бажаного. Часова бомба, дещо інша адреса.

У правилах переписання так багато піт-падінь, що це зовсім не пряма логіка.
Ви можете запустити і запустити Apache за десять хвилин, це 10 Мб, хороша ліцензія, * NIX / WIN / MAC готовий навіть без встановлення.
Також перевірте рядки заголовків вашого сервера і отримайте ту саму версію Apache з їх архіву, якщо вона стара. Мій ОП ще на 2.0; багато речей не підтримуються.


papo, я використовував спеціалізовані сервери, VPS, що розміщений підключеним до Інтернету, і приватні віртуальні машини в межах своєї структури розробки, але я все ще використовую спільний сервіс хостингу для своїх публічних доменів та електронної пошти, просто тому, що використовувати зручніше та економічно зручніше використовувати сервіс для них. Цей спосіб дійсно орієнтований на користувачів спільних послуг. Налаштувати приватний VM для відображення спільної послуги повністю. Так, якщо ви можете, використовуючи тестовий VM, це допомагає, але я все одно час від часу використовую ці "хитрощі" на моїй спільній службі.
TerryE

1
Я погодився би з цим, якби ваш A був охарактеризований як альтернативна пропозиція щодо mod_rewriteправил налагодження , але відкриття «навіть не думайте про це» - це просто погана порада для основних користувачів спільних служб, які намагаються зрозуміти, чому їхні htaccessфайли не є ' t працювати так, як вони роблять те, що слід.
TerryE

Мені шкода, якщо це звучало як твоя робота зі збору приємної колекції порад була марною. Я цього не хотів. Повірте, я дуже радий читав і дотримувався багатьох порад, пропонованих цією темою. Але мої правила повільно ускладнювалися, і врешті-решт я витрачав багато часу, просто не бажаючи переживати проблеми встановлення сервера Apache та виконувати налагодження, як це слід зробити. Більше того, я нічого не дізнався, як не бачив у журналах, що насправді відбувається. І багато чого відбувається. Я вважаю, що також цінно поділитися цим досвідом.
папо

для другої частини є ІФ. Мій текст ніколи не починався з "навіть не думати про", я бачу зараз, це формулювання здається трохи суворим, але все це правда. Особливо для тих, хто в цьому новачок і намагається зрозуміти. Консультує тут, може, неправильно керувати ними, як я, що все, що мені потрібно, - це суцільний регулярний вираз, це не так просто, як ваш пункт 6). Якщо ви не хочете, щоб його було повторно додано, використовуйте [DPI]. Але лише якщо ви подивитеся на журнали, ви побачите, що вони додаються туди. Тому більше, ніж один рядок, і вам краще використовувати журнали
папо

1
Вибачте @papo, але моя причина -1 голосування полягала в тому, що я вважаю, що це "навіть не думай про це" - це погана порада, IMO. Якщо ваша думка полягала в тому, що "вище певної складності, вам може бути легше встановити локальну службу Apache для налагодження ваших .htaccessфайлів", тоді це більш врівноважено. Так, налаштувати локальну службу Apache досить просто, але отримати її так, щоб вона відображала спільний хостинг-провайдер постачальника послуг, може бути складним, і поза рівнем майстерності багатьох користувачів, які, можливо, тільки що використовували налаштування Wordpress одним натисканням, скажімо, і мають проблеми зі своїм .htaccessфайлом.
TerryE

1

Я залишу це тут, можливо, очевидною деталлю, але змусив мене стукати головою годинами: будьте обережні, %{REQUEST_URI}тому що те, що говорить @Krist van Besien у своїй відповіді, є абсолютно правильним, але не для рядка REQUEST_URI , тому що це не так TestString починається з a /. Тож подбайте:

RewriteCond %{REQUEST_URI} ^/assets/$  
                            ^
                            | check this pesky fella right here if missing

0

(Подібно до ідеї Doin) Щоб показати, що відповідає, я використовую цей код

$keys = array_keys($_GET);
foreach($keys as $i=>$key){
    echo "$i => $key <br>";
}

Збережіть його в r.php на корені сервера, а потім зробіть кілька тестів у .htaccess
Наприклад, я хочу відповідати URL-адресам, які не починаються з мовного префікса

RewriteRule ^(?!(en|de)/)(.*)$ /r.php?$1&$2 [L] #$1&$2&...
RewriteRule ^(.*)$ /r.php?nomatch [L] #report nomatch and exit

1
просто використання заглушки phpinfo (), як я вже згадував у пункті 4, на моєму O / P робить в основному те саме. ШукайтеQUERY_STRING
TerryE

0

як вказував @JCastell, онлайн-тестер робить хорошу роботу з тестування окремих переадресацій на файл .htaccess. Однак більш цікавим є експозиція api, яку можна використовувати для пакетного тестування списку URL-адрес за допомогою об’єкта json. Однак, щоб зробити це кориснішим, я написав невеликий файл скриптів bash, який використовує curl та jq, щоб подати список URL-адрес та проаналізувати відповідь json у форматі CSV виводу з номером рядка та правилом, узгодженим у файлі htaccess разом із перенаправленим URL-адресом, що робить досить зручним порівняння списку URL-адрес у електронній таблиці та швидко визначити, які правила не працюють.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.