конечные косые черты в 301 редиректе - PullRequest
1 голос
/ 29 июня 2011

Я пытался просмотреть несколько вопросов 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/, он отображает страницу, но если вы идетена domain.com/about.php расширение не удаляется.

Кроме того, у меня есть 301 перенаправление

redirect 301 /our-clients http://www.domain.com/about-ourclients

Это прекрасно работает, но если пользователь переходит на domain.com/ our-clients / с косой чертой в конце они направляются в about-ourclients.php

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

1 Ответ

2 голосов
/ 30 июня 2011

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

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, то я предполагаю, что это желаемое поведение.

...