2011-07-13 3 views
0

У меня есть следующие правила для работы которых:mod_rewrite - проблема с комбинацией правил

  • действует только на файлы, которые существуют
  • исключить любые файлы, которые содержат изображения | JS | CSS в их URI
  • добавить косую черту просить Uri

правила Rewrite:

RewriteEngine on 
DirectorySlash Off 

RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !/(images|js|css)$ 
RewriteRule ^(.*[^/.])$ /$1/ [R=301,L] 

мне теперь нужно правильно перенаправить мой дом Ури так:

http://www.example.com/sitemap/ ->http://www.example.com/index.php?page=sitemap

Я пробовал следующий подход:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*[^/.])$ index.php?page=$1 [R=301,L,NC] 

Но я получаю страница не найдена, предположительно потому что 1 доллар получает что-то с косой чертой. Я думал, что [^/] удалит его, но, видимо, нет.

Может кто-нибудь объяснить, где я иду здесь неправильно?

+0

Зачем вам нужно ** перенаправление ** (URL-адрес изменится в браузере)? Обычно люди хотят сохранить «хороший» URL-адрес и просто переписать URL-адрес (внутреннее перенаправление), когда URL-адрес остается неизменным в браузере. Это намеренно .. или по ошибке (я имею в виду ваше второе правило - 'R = 301')? – LazyOne

+0

Это ошибка, я немного туманно о том, как бит redirect работает честно. Вы правы, я хотел бы сохранить хороший URL. –

ответ

1

Используйте это правило - он перепишет /sitemap/ в /index.php?page=sitemap:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/$ /index.php?page=$1 [QSA,L] 
  1. Поместите его в .htaccess в корневой папке сайта. Если его разместить в другом месте, его нужно немного изменить.

  2. URL-адрес будет таким же. Существующая строка запроса будет сохранена.

  3. Должно присутствовать конечная черта / (т. Е. /sitemap не вызывает это правило).

  4. Он будет переписан только в том случае, если такой папки или файла нет (т. Е. Если в корневой папке вашего сайта есть папка с именем sitemap, тогда перезаписи не будет).

  5. Он будет работать только для URL с глубиной 1 папки (например, /sitemap/, , /user-account/ и т. Д.). Он не будет работать для двух или более папок в пути (например, /account/history/).


RE: эта линия:RewriteCond %{REQUEST_URI} !/(images|js|css)$.

Вы сказали (а) "исключить любые файлы, которые содержат изображения | js | css в их uri". К сожалению, приведенная выше картина работает по-другому - она ​​будет соответствовать /something/css, но не соответствует /css/something или /something/file.css.

Если вы хотите совместить изображения | js | css ANYWHERE в URL прямо после косой черты, затем удалите $.

+0

Фантастический! Это прекрасно работает сейчас, спасибо за объяснение и новые правила. Каков наилучший способ 301 перенаправления index.php? Page = sitemap to/sitemap/now? –

+1

@eb_Dev С точки зрения SEO у вас есть 2 варианта: 1) Используйте фактическое 301 переадресацию (что является предпочтительным вариантом) или 2) используйте канонический URL-адрес (http://www.google.com/support/webmasters/bin/answer .py? ответ = 139394). Для 301 перенаправления: 'RewriteCond% {QUERY_STRING} = page = sitemap [NC]' 'RewriteRule^index \ .php $ http: //% {HTTP_HOST}/sitemap /? [NC, R = 301, L] ' – LazyOne

+0

Также у меня есть еще одна проблема, которая, по моему мнению, сводится к моему первому правилу: RewriteRule^(. * [^ /.]) $/$ 1/[R = 301, L] если я вхожу в http://www.example.com/adadass/ или любой файл, который не существует, он сопоставляет его с домашней страницей и рассматривает ее как страницу. Я решил, что RewriteCond% {REQUEST_FILENAME}! -f (или! -d) предотвратит это, но я должен ошибаться? –

Смежные вопросы