我正在尝试重写网址,以便用户/搜索引擎友好,然后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重写/重定向?
感谢您一看:)
答案 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