мод-переписать, как реализовать второе правило? - PullRequest
1 голос
/ 01 февраля 2020

Я пытаюсь получить .htaccess файл RewriteRule в своем веб-приложении. Мне нужно двойное правило для соответствия двум форматам URL, которые могут произойти:

Правило 1 (не прокомментировано ниже и работает как обаяние)

    http://example.com/whatever -> /index.php?page=whatever&
    http://example.com/whatever/ -> /index.php?page=whatever&
    http://example.com/whatever/?test=me -> /index.php?page=whatever&test=me

Правило 2 (закомментировано ниже и не комментируется работать, но должно работать следующим образом)

  http://example.com/api/ -> index.php?page=api&func= 
  http://example.com/api/whateverelse -> index.php?page=api&func=whateverelse 

Папка /api/ не существует на сервере, и при чтении документации параметры L должны предотвратить синтаксический анализ большего количества правил. Тем не менее, если я раскомментирую ^\/api\/(.*)$, я получу ответ 404.

Цель состоит в том, что если первое правило будет проанализировано, второе правило будет пропущено, и цель состоит в том, чтобы первое правило действительно работало.

Есть ли кто-то, кто мог бы указать мне правильное направление здесь?

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

#RewriteRule ^\/api\/(.*)$    //index.php?page=api&func=$1 [NC,L]
RewriteRule ^\/?([^\/]+)\/?$ //index.php?page=$1&%{QUERY_STRING} [NC,L]

Я попытался отладить его, добавив: LogLevel alert rewrite:trace6

, но это не разрешено в .htaccess и у меня нет прямого доступа к файлам конфигурации сервера.

1 Ответ

0 голосов
/ 01 февраля 2020
#RewriteRule ^\/api\/(.*)$    //index.php?page=api&func=$1 [NC,L]

Это не работает, потому что в .htaccess URL-путь, соответствующий шаблону RewriteRule , не начинается с sla sh. Вы включили префикс sla sh в регулярное выражение, чтобы он никогда не совпадал.

В следующем правиле префикс sla sh становится необязательным с квантификатором ?, ie. ^\/? - так оно и будет совпадать. (Префикс sla sh требуется только в том случае, если директива используется в контексте сервера. Делая ее «необязательной», она будет работать в любом из вариантов.)

Если вы используете только .htaccess, тогда вы может полностью удалить префикс sla sh из шаблона RewriteRule .

Например:

RewriteRule ^api/(.*) /index.php?page=api&func=$1 [NC,L]

Дополнительные примечания ...

  • Не нужно backsla sh избегать косых черт в регулярном выражении, поскольку они не имеют особого значения. (Apache использует пробелы в качестве разделителей аргументов.)
  • Не знаете, для чего использовался префикс double sla sh в строке substitution ? ie. //index.php. У вас должно быть не более одного sla sh здесь, или ни одного вообще для внутренней перезаписи (и файл index.php находится в том же каталоге, что и файл .htaccess). (Двойной sla sh по-прежнему «работает» только потому, что Apache уменьшает количество множественных слешей при сопоставлении URL-адреса с файловой системой.)
  • Директивы RewriteCond применяются только к первой * Директива 1038 *, которая следует, поэтому вам может потребоваться повторить их для второго правила. (Или переверните логи c и остановите обработку, когда запрос сопоставляет с файлом / каталогом? Однако это может зависеть от того, какие другие директивы у вас есть в файле.) Если у вас нет физические файлы, которые начинаются с /api, затем вы можете удалить условия из этого правила.
  • Вам не нужно вручную добавлять QUERY_STRING к замене . Для этого и используется флаг QSA (Query String Append). Флаг QSA также позволит избежать появления паразита & в конце, когда в запросе отсутствует строка запроса.
  • Флаг NC не требуется в последнем правиле. Это может не потребоваться для правила "api", если только /API или /ApI et c. может потребоваться - но этого следует избегать.

Итак, собрав это вместе, мы получим ....

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/(.*) /index.php?page=api&func=$1 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ /index.php?page=$1 [QSA,L]
...