0

我正在尝试重写一个 URL,使其对用户/搜索引擎友好,然后 301 将原始 URL 重定向到新 URL。

目前帖子生成如下: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 重写/重定向?

谢谢你看:)

4

2 回答 2

1

详细说明 tdammers 关于 header() 的建议

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

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

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

于 2012-08-27T00:26:33.427 回答
0

Going to assume you've got these rules in an htaccess file in your /blog/ directory. Try adding a RewriteBase and removing the leading slash from your query string backreference:

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
于 2012-08-26T17:41:23.293 回答