Удаление .php из example.com/.php

Удаление .php из example.com/.php

Для удаления только .php из моих URL-адресов у меня в настоящее время есть следующее

# Remove trailing slashes
RewriteRule ^(.*)\/$ $1 [NC,L,R=301] 

# Remove trailing .php extensions
RewriteCond %{THE_REQUEST} (\S*?)/(.*?)\.php [NC]
RewriteRule ^ %1/%2 [L,R=301]

# Add .php extension for final internal redirect
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule !\.php$ %1.php [NC,L]

Но эти правила не работают для bare, example.comтак как в итоге получается example.com/.php. Так как я могу это исправить?

решение1

Вам необходимо либо:

  • Проверьте, существует ли файл назначения (с .phpрасширением)довнутренне переписывая его
  • Избегайте перезаписи каталогов (для которых корневой каталог документов является одним из них).
  • Избегайте перезаписи только корня документа (как в вашем примере).

Например, чтобы избежать переписывания только корня документа, как в вашем конкретном примере, вы можете изменить существующую RewriteCondдирективу:

# Add .php extension for final internal redirect
RewriteCond %{REQUEST_URI} ^(.*)$

читать:

RewriteCond %{REQUEST_URI} ^(/.+)$

/.+соответствует косой черте, за которой следуетчто-нибудь, что исключило бы корень документа, поскольку корень документа сам по себе является косой чертой.


Чтобы избежать перезаписи всех каталогов (одним из которых является корневой каталог документа), можно добавить дополнительное условие, чтобы избежать перезаписи URL-адресов, которые отображаются в физическом каталоге. Например:

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

Однако, если у вас есть каталоги, которые доступны, то вам следует изменить существующее правило, которое удаляет завершающие слеши, в противном случае вы, скорее всего, получите цикл перенаправления при запросе каталога (так как mod_dir по умолчанию добавит слеш). Например:

# Remove trailing slashes
RewriteRule ^(.*)\/$ $1 [NC,L,R=301]

Необходимо изменить, включив в него то же условие, что и выше:

# Remove trailing slashes, unless the request maps to a directory
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [L,R=301]

Также, здесь нет необходимости в NCфлаге. И нет необходимости избегать косой черты вRewriteRule шаблон.

Я предполагаю, что у вас также должна быть RewriteBaseопределена директива в другом месте вашего файла, в противном случае это, скорее всего, приведет к недопустимому перенаправлению в .htaccess.

Связанный контент