Удаление .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]

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

1
задан 11 March 2018 в 16:46
1 ответ

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

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

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

 # Добавить расширение .php для окончательного внутреннего перенаправления
RewriteCond% {REQUEST_URI} ^ (. *) $
 

читать:

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

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


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

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

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

 # Удалить завершающие косые черты.
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 .

1
ответ дан 3 December 2019 в 23:19

Теги

Похожие вопросы