косая черта в конце 301 редиректа

Я пытался просмотреть несколько вопросов 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.

Любые советы о том, как переписать мои правила?


person brianrhea    schedule 29.06.2011    source источник


Ответы (1)


Это должно сделать работу:

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]
  1. Он будет перенаправлять все прямые запросы на файлы php: /something.php будет перенаправлен на /something

  2. Удаляет косую черту в конце, если запрошенный ресурс не является каталогом. Поэтому, если вы запрашиваете /home/ и у вас есть такая папка, она НЕ будет перенаправлена ​​на /home.

  3. Будет внутренне переписывать запросы к файлу PHP с тем же именем, ЕСЛИ он существует. Если вы запрашиваете /about и у вас есть /about.php, то он будет перезаписан; Если у вас нет /about.php, то ничего не происходит (ну, по крайней мере, не по этим правилам - если у вас больше правил, то такой запрос может быть сопоставлен позже.. или будет показана страница с ошибкой 404).

  4. Если вы запрашиваете /about, у вас есть /about.php и у вас также есть папка /about, то запрос попадет в папку. Если вы не хотите, чтобы это произошло (/about всегда следует перезаписывать в /about.php), вам нужно удалить RewriteCond %{REQUEST_FILENAME} !-d из последнего блока. Но поскольку у вас точно такое же состояние в вашем текущем .htaccess, я предполагаю, что это желаемое поведение.

person LazyOne    schedule 30.06.2011
comment
Работает безупречно. Большое спасибо! - person brianrhea; 01.07.2011