【问题标题】:mod_rewrite Friendly URL clashing with 404mod_rewrite 友好的 URL 与 404 冲突
【发布时间】:2012-08-26 22:43:24
【问题描述】:

我一直在为我的 mod_rewrite 苦苦挣扎,我以为我已经破解了它……

我的 CMS 使用 post.php?s= 生成博客文章 URL,我一直在尝试删除 URL 的这一部分,以使它们美观且用户友好。这是我的 mod_rewrite:

<ifModule mod_rewrite.c>

DirectoryIndex index.php index.html

ErrorDocument 404 http://tempertemper.net/error.php

RewriteEngine On

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

RewriteCond %{HTTP_HOST} ^www.tempertemper\.net$
RewriteCond %{REQUEST_URI} !cron.php
RewriteRule ^(.*)$ http://tempertemper.net/$1 [R=301,L]

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

RewriteRule ^resources /archive? [R=301,L]

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

</ifModule>

不幸的是,它似乎将所有未找到的页面定向到空白 post.php 页面而不是 error.php 页面。

我的网站在这里:http://tempertemper.net,这是一个不存在的 URL http://tempertemper.net/this-url-does-not-exist

它应该带你到http://tempertemper.net/error

感谢您的浏览:)

【问题讨论】:

  • 找不到页面的示例是什么? /post.php?s=blahblah?
  • 嗨 @Jon,CMS 生成 example.com/post.php?s=blahblah,我将其重写为 example.com/blahblah
  • 但是它怎么知道blahblah 没有找到呢?

标签: php .htaccess mod-rewrite http-status-code-404 http-status-code-301


【解决方案1】:

因为您正在重定向所有符合[a-zA-Z0-9_-]+ 模式的路径,所以这只会将查询字符串s=this-url-does-not-exist 发送到您的post.php 脚本。因此,由您的 PHP 脚本 post.php 来检查 this-is-not-a-url 是否存在,因为 Apache 不可能知道哪些博客文章 ID 值是有效的,哪些是无效的。

作为旁注,我建议使用/blog/2012-08-24-whatever 作为您为访问者提供的路径,而不是/2012-08-24-whatever。这样您就可以为其他函数(例如 /images)保留路径,而无需在每次需要创建新的实用程序路径时在 .htaccess 文件中编写新的异常。

【讨论】:

  • 按照建议,我现在已将博客移至其自己的文件夹中。谢谢。那么所有不是现有页面的东西都被重定向了吗?我猜想将博客移动到具有自己的 .htaccess 的自己的文件夹允许 404 在站点的其余部分中工作。但我想最好以某种方式为博客重写 mod_rewrite。我有点迷茫……你会如何从 URL 中删除 post.php?s=?我所追求的是一种生成从 example.com/blog/post.php?s=nice-post 到 example.com/blog/nice-post 重定向的所有博客文章的方式。感谢您的帮助@user1515834 :)
  • 这就是你所拥有的。但是因为用户可以提供一个完全符合模式的 /blog/name-of-post,但是引用了一篇不存在的文章,你需要修改你的 PHP 脚本来检查 name-of-post 是否真的存在,并且,如果没有,告诉 PHP 脚本发出 404 标头和一条消息,向用户解释他们请求的文章不存在。如果 PHP 从数据库中获取它们,Apache 无法知道存在哪些博客文章。
  • 明白了。抱歉,如果我的吸收速度有点慢 - mod_rewrites 不是我的强项!感谢您的帮助:)
  • 有点跑题了,但我想你不知道如何逃避 ?网址中的字符,是吗?这行不通,因为 ?但我需要将原始 URL 指向新 URL:RewriteRule ^post.php?s=2012-04-28-evernote$ /blog/evernote? [R=301,L]
  • 为避免在这里弄得一团糟,最好为此提出一个新问题。确保使用 .htaccess mod-rewrite 和 php 对其进行标记,以引起合适人的注意。
猜你喜欢
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2012-12-29
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
相关资源
最近更新 更多