Mod重写斜线问题

时间:2011-04-24 22:27:12

标签: php regex mod-rewrite

我在网站上搜索了这个问题,但我找不到解决方案。

我有一个php页面,打电话 http://www.domain.com/topic.php?name=xyz

我想用这个页面来打电话 http://www.domain.com/topic/xyz

我尝试的是什么;

  

RewriteEngine On

     

RewriteRule ^ topic /([^ /] *)$ /topic.php?name=$1 [L]

但是由于这个“/”我得到404错误。如果我尝试“ - ”而不是“/”它可以工作。我想“/”将用户转发到文件夹“/ topic”,所以我需要一个解决方案来修复它。

5 个答案:

答案 0 :(得分:1)

鉴于您的主题名称遵循模式([a-zA-Z0-9-_]+)这一事实,以下情况应该有效 - 如果它与模式不匹配,它可能应该(并且您的工作是清理它以使其匹配),因为这是一个URL。

RewriteEngine On
RewriteRule ^topic/([a-zA-Z0-9-_]+).html$ topic.php?name=$1 [L]

注意:

在您的请求中,您说您希望网址如下所示:http://www.domain.com/topic/xyz并且在.htaccess规则中,您最后尝试使用.html编写它。如果您最后不想要.html,则应执行以下操作:

RewriteEngine On
RewriteRule ^topic/([a-zA-Z0-9-_]+)$ topic.php?name=$1 [L]

答案 1 :(得分:1)

我找到了解决问题的方法。虽然有点晚了:)

我编辑我的.htaccess

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule .* redirect.php [L] 

如你所见,我创建了一个redirect.php。在这个文件中,我爆炸斜杠,然后使用if语句设置

$path =  explode("/", $_SERVER['REQUEST_URI']);
switch ($path[1])
{
    case 'topic': $_GET[name]=$path[2]; include('topic.php'); break;
}

正如你所看到设置$ _GET一样,代码并不帅,但它就像一个魅力! :)感谢所有人的帮助。

答案 2 :(得分:0)

再太无聊了。

我的.htaccess(摘自你的问题):

RewriteEngine on
RewriteBase /
RewriteRule ^topic/([^/]*)$ /topic.php?name=$1 [L]

我的话题.php:

<?php

var_dump($_GET);

请求:

http://localhost/topic/xyz

结果:

array(1) { ["name"]=> string(3) "xyz" }

所以它只适用于Apache 2.2.14

答案 3 :(得分:0)

我认为你需要逃避正斜杠,如下:

RewriteRule ^topic\/([^\/]*)$ topic.php?name=$1 [L]

在Bogdan的解决方案中,你在角色类之后缺少一个+,现在它只匹配一个角色:P

答案 4 :(得分:0)

如果您的AddHandler type-map var中有httpd.conf行,请尝试对其进行评论。

这可能看起来很奇怪,但是这个功能(不经常使用,但是在Apache“It Worked!”页面的默认httpd.conf中启用)已经让我在过去的类似路线上感到悲伤。

这与你有一个文件“topic.php”的事实有关,而Apache允许你像“topic / en-us”那样调用它。或类似的东西。您必须look up the feature in the Apache docs才能获得具体信息;我只是想要记忆。