Цель состоит в том, чтобы объединить несколько правил:
Это должно быть сделано в .htaccess, так как это доступно мне только.
Моя попытка до сих пор
# check if *.php exists RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*[^/])/?$ $1.php [L, QSA] # do not allow trailing slash RewriteRule (.*)/ $1 [L, R=301]
Трудность здесь заключается в том, что запрос domain.tld / somedir обычно вызывает индекс index.php каталога после перенаправления на 'domain.tld / somedir /'. Тем не менее, я хотел бы, чтобы index.php был внутренне вызван (нет 301) непосредственно при запросе «domain.tld / somedir».
Вы можете использовать этот код:
DirectoryIndex index.php RewriteEngine On # remove trailing slash RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s] RewriteRule ^(.+?)/$ /$1 [R=301,L] # To internally forward /dir/file to /dir/file.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/$1.php -f [NC] RewriteRule ^(.+?)/?$ /$1.php [L]
Существует отдельный параметр в apache, называемый DirectorySlash
который может быть включен / отключен. Вы можете прочитать больше на httpd.apache.org/docs/2.2/mod/mod_dir.html#directoryslash, но не забудьте прочитать часть о том, почему это делается прямо внизу, где говорится «некоторые веские причины». Также обратите внимание на проблему безопасности.