Назад | Перейти на главную страницу

Удаление .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. Так как я могу это исправить?

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

  • Убедитесь, что файл назначения (с .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.