.htaccess 友好的URL和301重定向

.htaccess 友好的URL和301重定向,.htaccess,mod-rewrite,redirect,http-status-code-301,friendly-url,.htaccess,Mod Rewrite,Redirect,Http Status Code 301,Friendly Url,我试图重写一个URL,使其对用户/搜索引擎友好,然后将原始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_ST

我试图重写一个URL,使其对用户/搜索引擎友好,然后将原始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重定向冲突,将所有页面都找不到空白PASS.PHP文件,并且我不能解释为什么。有没有更好的方法来实现URL重写/重定向


感谢您查看:)

假设您的
/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

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

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


i、 e.如果发现页面无效,PHP会向浏览器发送一个404头,通知它这是一个缺少的页面。不幸的是,没有直接的方法重定向到Apache的默认404页面,因此您必须自己输出一些内容——但是由于您已经有了一个自定义404页面,您可以只包含()。

如果找不到帖子,您能否更改
post.php
本身以发出404(
header()
是您的朋友)?这是我能想到的最简单的方法,因为你的重写规则不可能知道哪些帖子存在,哪些不存在。我的php技能还很初级——你有没有链接到我可以利用的资源?试试
header()
:谢谢@tdammers,但我想你把我弄丢了——这是一个非常普通的页面……嗨@jon,你说得对——对不起!我应该提到正在进行工作的.htaccess文件位于/blog/目录中!我尝试过这项修正案,它似乎做了和以前一样的事情:Hi@SáT,看起来像我想要的。我试图让它工作,但我得到了错误…尝试包括(');和readfile(');代替了回声,但它没有回声。恐怕这不是我的专业领域,所以可能需要更多的人手……对不起,如果我太笨了!:)没关系。但究竟是什么样的错误呢?可能[已经发送]?我在文档的一开始就运行了这个,然后是通常的操作,等等。我应该在初始include之后使用if(!$valid…)还是在其他地方使用
if( !$valid ) {
    header( 'HTTP/1.0 404 Not Found' );
    echo "404";
    exit;
}