mod_rewrite - 正在重写的一些请求应生成404但不生成

时间:2011-07-14 11:12:02

标签: mod-rewrite redirect http-status-code-404

我一直致力于为我的网站创建seo友好网址,并已成功完成以下规则:

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]

我的问题在于,由于最后一条规则(我认为),任何根目录请求都会变成一个友好的网址,例如/pagethatdoesntpointanywhere/,无论它是否指向任何地方。现在我对404感到满意,但它并没有这样做只是显示主页。

我也尝试过添加一条404条规则:

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

但这也使得所有友好的网址都是404。

有人可以解释我在哪里错了吗?

1 个答案:

答案 0 :(得分:1)

  1. 当Apache无法找到文件时,使用ErrorDocument 404 /notfound.cfm显示未找到的错误页面(用文件替换notfound.cfm)。

  2. index.cfm中,如果page参数的值未知(例如pagethatdoesntpointanywhere),则显示404错误页面(使用与notfound.cfm相同/相似的代码)。这是考虑您的重写规则以及检查要在哪里显示哪个页面这一事实的正确位置。许多产品/框架以类似的方式工作(例如:WordPress)。

  3. 同时使用#1和#2。数字#2适用于1个文件夹的深层网址(例如/meow/),而#1会捕获任何其他网址(例如/meow/kitten//meow/wuf/oink.css)。