【问题标题】:Rewrite URL in .htaccess just cause 404 error在 .htaccess 中重写 URL 只会导致 404 错误
【发布时间】:2014-05-02 23:02:10
【问题描述】:

我正在尝试学习如何在 .htaccess 文件中重写 URL。我已经阅读了一些教程,但尽管我按照示例代码编写,但对我来说什么也没发生!我想知道我在这里做错了什么?当我尝试下面的代码时,我得到了一个 404 代码。

RewriteEngine On
RewriteRule /byggnader/1/ /?p=byggnad&id=1

这只是一个测试,我想知道/byggnader/ 是否必须是现有文件或只是 URL 中的名称。我正在使用页面控制器设计。所以 URL /?p=byggnad&id=1 将打开PSelectedBuilding.php 文件内的index.php 文件。

我感谢一些反馈,以便能够继续。

编辑:尽管有以下帮助,它仍然无法正常工作,因此我还添加了处理请求的 index.php 文件中的代码。也许这可以说明原因!?

<?php
session_start();
// Allow only access to pagecontrollers through frontcontroller
$indexIsVisited = TRUE;

require_once('config.php'); 

// pagecontrol
$page = isset($_GET['p']) ? $_GET['p'] : 'start';
switch($page) {
case 'start':           require_once('PIndex.php'); break;
case 'karta':           require_once('PMap.php'); break;
case 'byggnader':       require_once('PBuildings.php'); break;
case 'tips':            require_once('PTips.php'); break;
case 'visa-byggnad':    require_once('PHandleSessions.php'); break;
case 'byggnad':         require_once('PSelectedBuilding.php'); break;
case 'visa':            require_once('PSelectedBuilding.php'); break;
case 'visa2':           require_once('PHandleSessions.php'); break;
default:                require_once('PIndex.php'); break;
}
require_once("CreatePage.php"); // Call file that creates the page
?>

编辑 2:

这很好用,但当我对某些页面使用请求时就不行了:

RewriteEngine On

RewriteRule bilder-byggnader-kopenhamn /?p=byggnader

RewriteRule karta-byggnader-kopenhamn /?p=karta

RewriteRule start /?p=start

RewriteRule tips /?p=tips

【问题讨论】:

  • 你到底想达到什么目的?
  • @elbuild 获得像 WordPress 中的更清晰的 URL
  • 是的,我猜到了。但我问的是你想用这条规则达到什么目的(因为它不正确但不了解它的目的很难帮助你)
  • 我希望 URL 是 /byggnad/1/ 而不是 /?p=byggnad&id=1 我认为 .htaccess 文件中的代码可以解决这个问题,但我想这是错误的。怎么了?
  • RewriteRule 指令重写请求匹配第一项,第二项...如果您的目的是获取 /byggnad/1/ 作为输出,您可能至少需要更改参数的顺序.此外,查询字符串应该以不同的方式匹配。

标签: php regex apache .htaccess mod-rewrite


【解决方案1】:

从规则中删除前导斜杠。 .htaccess 是每个目录指令,Apache 从 RewriteRule URI 模式中删除当前目录路径(因此是前导斜杠)。

RewriteEngine On
RewriteRule ^byggnader/1/?$ /?p=byggnad&id=1 [L]

【讨论】:

  • 谢谢,但这不起作用!当我在域名后输入 /byggnader/1/ 时,我只是收到此错误:在此服务器上找不到请求的 URL /byggnad/1/。
  • 您确定.htaccess 已启用?
  • 是的,我已经请求支持
  • 验证您的.htaccess 是否已启用,方法是在您的.htaccess 上放置相同的垃圾(随机)文本,看看它是否会产生500(内部服务器)错误?还告诉我这个 .htaccess 的位置
  • 它已启用,因为我在添加一些随机文本时收到错误消息。我在本地主机上测试这个,所以我想我不能给你任何位置。时间不早了,明天还要继续。到目前为止谢谢!
【解决方案2】:

试试这个:

RewriteEngine On
RewriteCond %{QUERY_STRING} p=(\w+)&id=(\d+)  
RewriteRule ^index.php /%1/%2? [R=301, L]

RewriteCond 对查询字符串进行数学运算(根据您的意愿)提取两个变量,您可以在重写规则指令中重复使用这些变量来构建重定向目标。最后一个问号告诉 Apache 不要重新附加现有的 QS。 R=301 表示重定向是永久性的,L 表示这是要处理的最后一条规则。

您可能不得不使用index.php 部分,因为您从未将REQUEST_URI 部分放在您的问题中。

【讨论】:

  • 您好,感谢您的回答!我怎样才能“玩弄我的 index.php”?
  • 我的意思是让 index.php 部分适应你的场景(你的 URL 的前一部分)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多