2011-04-24 151 views
0

我在网站中搜索了这个问题,但是我找不到解决方案。Mod重写斜杠问题

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

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

我试过是;

RewriteEngine叙述在

重写规则^话题/([^ /] *)$ /topic.php?name=$1 [L]

的但是因为这种 “/” 我得到404错误。如果我尝试使用“ - ”而不是“/”,它就会起作用。我猜“/”转发用户到文件夹“/ topic”,所以我需要一个解决方案来解决它。

+0

哪个“/”?你有几个。 – 2011-04-24 22:56:02

+0

代码中的第一个。当我打电话给... com/topic/xyz时,它将指向“主题”文件夹并返回404。 – 2011-04-24 22:57:23

+0

您的规则对我来说工作得很好。文件'topic.php'确实存在于根文件夹中吗? “.htaccess”是否位于根文件夹中? – ridgerunner 2011-04-24 23:24:30

回答

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作为代码不帅,但它就像一个魅力! :)谢谢你的帮助。

0

太无聊了再猜。

我的.htaccess(从你的问题采取):

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

我topic.php:

<?php 

var_dump($_GET); 

请求:

http://localhost/topic/xyz 

结果:

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

所以它只是工作在Apache 2.2.14

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和你试图把它与.html在最后写的.htaccess规则。如果你不想.html在最后,你应该做到以下几点:

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

我尝试了,但我仍然收到同样的错误。我在想它是否与“AllowEncodedSlashes on”命令相关。 – 2011-04-24 22:39:01

+0

在这种情况下,'[a-zA-Z0-9 -_]'和'[^ /]'没有明显的区别。你也错过了'*'(或'+')量词。 – zerkms 2011-04-24 22:39:42

+0

@zerkms我刚才看到我错过了'+',所以它只会匹配一个字符。自我注意:昏昏欲睡时不要回答:) – 2011-04-24 22:43:06

0

我认为你需要协商的斜杠,像这样:

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

而且在波格丹的解决方案你在字符类之后缺少+,现在它只匹配一个字符:P

+0

仍然会变得404。 问题与painthesis中的/没有关系,它是第一个。 – 2011-04-24 22:46:10

+0

为什么需要他? '/'在mod_rewrite中没有任何特殊的含义。 – zerkms 2011-04-24 22:47:06

+0

因为如果我将代码修复为 “RewriteRule^topic - ([^ \ /] *)$ /topic.php?name=$1 [L]” 然后www.domain.com/topic-xyz工作。 – 2011-04-24 22:48:16

0

如果您的中有AddHandler type-map var,请尝试将其注释掉。

这看起来很奇怪,但是这个功能(这个功能并不常用,但是在默认的httpd.conf中为Apache“It Worked!”页面启用)已经引起了我过去类似的悲痛。

这与事实有关,你有一个文件“topic.php”,Apache允许你把它称为“topic/en-us”。或这样的东西。你必须去look up the feature in the Apache docs才能得到具体细节;我正要离开记忆。

+0

我正在使用GoDaddy。所以对我来说没有希望,也许我应该接受一个事实,即我不能在我的网址中使用/。 – 2011-04-24 23:08:16

+0

@Kenshi:http://nodaddy.com/ – 2011-04-24 23:40:21

+1

感谢您的警告:)我会尽快逃脱。 – 2011-04-25 15:17:27