友好的URL和301重定向

时间:2012-08-26 10:06:26

标签: .htaccess mod-rewrite redirect http-status-code-301 friendly-url

我正在尝试重写网址,以便用户/搜索引擎友好,然后301将原始网址重定向到新网址。

目前帖子生成如下: example.com/blog/post.php?s=nice-post

但我希望他们看起来像这样: example.com/blog/nice-post

这是我到目前为止所得到的:

RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteCond %{QUERY_STRING} ^s=(.+)$
RewriteRule post.php /%1? [R=301,L]

RewriteCond %{REQUEST_URI} !post.php
RewriteRule ^([a-zA-Z0-9_-]+)$ post.php?s=$1

不幸的是,这与404重定向发生冲突,将找不到的所有页面发送到空白的post.php文件,我无法解决原因。有没有更好的方法来处理URL重写/重定向?

感谢您一看:)

2 个答案:

答案 0 :(得分:1)

阐述了tdammers关于header()

的建议

在你的post.php中,在输出任何内容之前,判断它是否是有效的帖子(例如通过在数据库中查找其id)。

if( !$valid ) {
    header( 'HTTP/1.0 404 Not Found' );
    echo "404";
    exit;
}

即。如果发现页面无效,PHP会向浏览器发送一个404标头,通知它这是一个丢失的页面。不幸的是,没有直接的方法可以重定向到Apache的默认404页面,所以你必须自己输出一些东西 - 但是因为你已经有了自定义的404页面,所以你可以只包括()。

答案 1 :(得分:0)

假设您已在/blog/目录中的htaccess文件中获得这些规则。尝试添加RewriteBase并从查询字符串反向引用中删除前导斜杠:

RewriteEngine On

RewriteBase /blog/

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteCond %{QUERY_STRING} ^s=(.+)$
RewriteRule post.php %1? [R=301,L]

RewriteCond %{REQUEST_URI} !post.php
RewriteRule ^([a-zA-Z0-9_-]+)$ post.php?s=$1