【问题标题】:Friendly URL and 301 redirect友好的 URL 和 301 重定向
【发布时间】:2012-08-26 10:06:25
【问题描述】:

我正在尝试重写一个 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 重写/重定向?

感谢您的关注:)

【问题讨论】:

  • 如果没有找到帖子,您能否更改post.php 本身以发出404(header() 是您的朋友)?这将是我能想到的最简单的方法,因为您的重写规则不可能知道哪些帖子存在,哪些不存在。
  • 嗨@tdammers,那很好。我的 php 技能还很初级——你有资源链接吗?
  • header() 上试用 PHP 文档:php.net/manual/en/function.header.php
  • 谢谢@tdammers,但我想你已经把我弄丢了——这是一个非常普通的页面......

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 嗨@SáT,看起来像我所追求的。我试图让它工作,但我遇到了错误……试过 include('tempertemper.net/error');和 readfile('tempertemper.net/error');代替回声,但它没有。不是我的专业领域,恐怕需要更多的牵手……对不起,如果我太厚了! :)
  • 没关系。但是到底是什么错误呢?也许 [stackoverflow.com/questions/8028957/… 已经发送”)?
  • 我在文档 的最开始运行了这个,然后是通常的 等。我应该在初始包含之后包含 if(!$valid... 吗?还是其他地方?
  • tempertemper.net/error');出口; } ?> 页面刚刚挂起。
  • tempertemper.net/error');出口; } ?> 我得到:警告:include() [function.include]:URL 文件访问在服务器配置中的 /home/users/uks71468/html/tempertemper.net/blog/post.php 第 5 行警告中被禁用:include(tempertemper.net/error)[function.include]:无法打开流:在第5行的/home/users/uks71468/html/tempertemper.net/blog/post.php中找不到合适的包装器
【解决方案2】:

假设您已经在/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

【讨论】:

猜你喜欢
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 2014-11-13
  • 2011-05-07
  • 1970-01-01
  • 2012-03-11
相关资源
最近更新 更多