Htaccess необязательный конечный слеш при ассоциировании URL без расширения с php - PullRequest
0 голосов
/ 13 января 2019

Я использую следующее правило, чтобы связать URL-адрес без расширения с файлом php.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)/$ $1.php [NC,L]

Я бы хотел, чтобы это работало независимо от конечной косой черты.

^([^\.]+)/$

Работает с / example /

^([^\.]+)$

Работает с / пример

^([^\.]+)/?$

Пробовал с тем, где косая черта не обязательна, но не дает желаемого результата.

1 Ответ

0 голосов
/ 13 января 2019
^([^\.]+)/?$

Это не будет работать так, как задумано, поскольку регулярное выражение по умолчанию является «жадным», поэтому захваченный шаблон использует косую черту, поскольку он необязательный в конце URL-пути. Другими словами, запрос на /foo/ заканчивается переписыванием на foo/.php, а не foo.php, как предполагалось.

Вы должны сделать захваченную группу нежадной, используя +? вместо +.

Например:

Options -MultiViews

RewriteEngine On

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

Кроме того ...

  • Флаг NC в директиве RewriteRule был излишним.
  • Нет необходимости экранировать буквальную точку в классе символов.
  • Вы должны убедиться, что MultiViews отключено (чтобы избежать потенциальных конфликтов в будущем, если не будет.)

В сторону: Однако, разрешив и /foo/, и /foo разрешить одну и ту же страницу, вы потенциально создаете проблему канонизации / дублирующийся контент. Вы должны решить, какой канонический и перенаправить извне один на другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...