mod_rewrite - некоторые переписываемые запросы должны выдавать 404, но не - PullRequest
1 голос
/ 14 июля 2011

Я работал над созданием SEO дружественных URL для своего сайта и успешно выполнил это по следующим правилам:

RewriteEngine on
RewriteBase /

#redirect non www to www
RewriteCond %{HTTP_HOST} ^example.co.uk [NC]
RewriteRule ^(.*)$ http://www.example.co.uk/$1 [L,R=301]

# Redirect any request with page=var to /var/ format
RewriteCond %{QUERY_STRING} ^page=(.+[^/])$ [NC]
RewriteRule ^index\.cfm$ http://%{HTTP_HOST}/%1/? [R=301,L,NC]

# If not an existing file or directory rewrite any request
# to page var.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+[^/])/$ index.cfm?page=$1 [QSA,L]

Моя проблема в том, что из-за последнего правила (я думаю), любойЗапрос root dir превращается в дружественный URL-адрес, такой как /pagethatdoesntpointanywhere/, указывает ли он куда-либо или нет.Теперь я был бы счастлив с 404, но это не то, что просто отображение домашней страницы.

Я также пытался добавить общее правило 404:

# 404 files that don't exist
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .+ /notfound.html [R=404,L,NC]

Но это также делает все дружественные URL-адреса 404-ми.

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

1 Ответ

1 голос
/ 14 июля 2011
  1. Используйте ErrorDocument 404 /notfound.cfm для отображения страницы с ошибкой не найден, когда Apache не может найти файл (замените notfound.cfm вашим файлом).

  2. In index.cfm, если значение параметра page неизвестно (например, pagethatdoesntpointanywhere), отобразить страницу ошибки 404 (используйте такой же / подобный код, как notfound.cfm).Это правильное место, учитывая ваши правила переписывания и тот факт, что вы в любом случае проверяете, какую страницу отображать здесь.Многие продукты / фреймворки работают аналогичным образом (например, WordPress).

Используйте и # 1, и # 2.Номер # 2 будет работать для глубоких URL-адресов из 1 папки (например, /meow/), а номер 1 будет перехватывать любые другие URL-адреса (например, /meow/kitten/ или /meow/wuf/oink.css).

...