Я пытался просмотреть несколько вопросов mod_rewrite, поэтому прошу прощения, если это дубликат.
Я пытаюсь настроить его так, чтобы при переходе на domain.com/about.php он удалял .php, а при переходе на domain.com/about он просто оставался таким.
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ /$1.php [L,QSA]
RewriteRule ^(.*)/$ /$1 [L,R=301]
Итак, прямо сейчас, если вы перейдете на domain.com/about, он отобразит страницу, но если вы перейдете на domain.com/about.php, расширение не будет удалено.
Кроме того, у меня есть 301 редиректы.
redirect 301 /our-clients http://www.domain.com/about-ourclients
Это работает отлично, но если пользователь перейдет на domain.com/our-clients/ с косой чертой в конце, он будет перенаправлен на about-ourclients.php.
Любые советы о том, как переписать мои правила?
Ответ 1 · рейтинг 2 · LazyOne
Это должно сделать работу:
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
# remove .php ONLY if requested directly
RewriteCond %{THE_REQUEST} (\.php\sHTTP/1)
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA]
# remove trailing slash ONLY if it is not an existing folder
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# rewrite to FILENAME.php if such file does exist and is not a folder
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ /$1.php [L,QSA]
Он будет перенаправлять все прямые запросы на файлы php: /something.php будет перенаправлен на /something
Удаляет косую черту в конце, если запрошенный ресурс не является каталогом. Поэтому, если вы запрашиваете /home/ и у вас есть такая папка, она НЕ будет перенаправлена на /home.
Будет внутренне переписывать запросы к файлу PHP с тем же именем, ЕСЛИ он существует. Если вы запрашиваете /about и у вас есть /about.php, то он будет перезаписан; Если у вас нет /about.php, то ничего не происходит (ну, по крайней мере, не по этим правилам - если у вас больше правил, то такой запрос может быть сопоставлен позже.. или будет показана страница с ошибкой 404).
Если вы запрашиваете /about, у вас есть /about.php и у вас также есть папка /about, то запрос попадет в папку. Если вы не хотите, чтобы это произошло (/about всегда следует перезаписывать в /about.php), вам нужно удалить RewriteCond %{REQUEST_FILENAME} !-d из последнего блока. Но поскольку у вас точно такое же состояние в вашем текущем .htaccess, я предполагаю, что это желаемое поведение.