2012-10-19 105 views
1

我一直冲倒我的脑海试图找出为什么我的URL重写不会工作!URL重写不工作?

即时通讯目前使用

RewriteEngine On 
Options +FollowSymLinks 
RewriteRule ^([^/]*)/([^/]*)/$ /profile.php?county=$1&name=$2&id=1 [L] 

没有任何影响,我已检查,看看mod_rewrite的是,它是。如果我使用

RewriteRule ^rdr\.html http://www.google.com/? [R=301,L] 

我重定向到谷歌,所以我知道它必须明确地做一件事。

的URL即时试图改写为...

http://www.mysite.com/profile.php?county=Cheshire&name=Martin-Mack&id=2 
+0

您可以尝试用(。*)替换([^ /] *),并确保您尝试重写的URL具有尾部斜线。 –

+0

运气不好@SamuelCook – Liam

+0

你想把'/ x/y /'改写成'/profile.php?county = x&name = y&id = 1',或者反过来呢? – nneonneo

回答

1

这个工作对我来说:

的.htaccess

RewriteEngine On 
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ profile.php?county=$1&name=$2&id=1 

profile.php

<h1>Profile</h1> 
<?php 
echo "County: " . $_GET['county'] . "<br>"; 
echo "Name: " . $_GET['name'] . "<br>"; 
echo "Id: " . $_GET['id']; 

此网址:http://localhost/tests/htaccess_test/Cheshire/Martin-Mack

生产THI小号HTML:

<h1>Profile</h1> 
County: Cheshire<br>Name: Martin-Mack<br>Id: 1 

Rendering in Opera

测试在Apache 2.2.21和5.3.10 PHP。


在我的测试,我已经把两个文件在http://localhost/tests/htaccess_test/,但你可以把它们放在所需;他们只需要在同一个文件夹中。

在你的情况,例如,你应该把这些文件放在你网站的根,所以,当你访问http://www.yoursite.com/Cheshire/Martin-Mack,重定向将工作。

如果您仍然无法得到它的工作,尝试RewriteEngine On之后加入RewriteBase /

完整的示例:

RewriteEngine On 
RewriteBase/
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ profile.php?county=$1&name=$2&id=1 

更新:在你的原代码,该id参数是静态的。为了得到它的工作,试试这个:

RewriteEngine On 
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ profile.php?county=$1&name=$2&id=$3 
+0

感谢@Simone的详细回复,但我仍然无法得到它的工作,即时通讯不知道,如果我正确理解这个整体概念。我访问的网址是site.com/profile.php?county=Cheshire&name=Liam-Gallagher&id=1 此链接使用php变量从我的php生成 – Liam

+0

我的示例工作方式不同。尝试访问'site.com/Cheshire/Martin-Mack',你应该*默默*重定向到'profile.php?county = Cheshire&name = Liam-Gallagher&id = 1' – Simone

+0

作品类别@Simone,然而我的问题是“ID”变量现在,它总是1,而它应该改变每个用户? – Liam

0

你的规则是非常接近的。

RewriteRule ^([^/]+)/([^/]+)/?$ /profile.php?county=$1&name=$2&id=1 [L] 
  • 我认为萨穆埃尔库克先生谈到您的问题---你的规则要求尾部斜杠。在规则结尾的斜线后添加?允许它和那些没有这两个URL。

  • 此外,修改后的规则使用+ s,而不是你的* S,因为*修改将匹配一个空字符串,并且可能会导致重定向循环。

旁注:当您测试时使用302重定向!您的浏览器将“记住” 301个重定向。

+0

感谢您的回复@smhmic,但它仍然没有工作:然而:/ – Liam

+0

@Liam通常,在规则开头的克拉('^')使它与我匹配。它仍然排除原因,因为该规则应与克拉一起工作,并不总是安全的删除...但尝试删除它只是为了看到。 –

2

不是一个确切的答案的问题,但也许有用的一般;你可以打开重写日志记录来帮助追踪问题。

Apache 2.2

RewriteLog com.example_rewrite.log 
RewriteLogLevel 3 

的语法已经Apache 2.4略有改变。

0

this answer clarifies how URLs get rewritten and redirected的顶部。那里有两件完全不同的事情。

如要变更/profile.php?county=foo&name=bar&id=1234一个URL到更好看的变化,你需要来匹配实际的请求并重定向浏览器:

RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /profile\.php\?county=([^&]+)&name=([^&]+)&id=([0-9]+) 
RewriteRule^/%2/%3/%4/? [L,R=301] 

注意,ID需要也是URL的一部分(通过%4反向引用)。这使得当有人在他们的浏览器中键入URL:http://mysite.com/profile.php?county=Cheshire&name=Martin-Mack&id=2时,他们将外部重定向到http://mysite.com/Cheshire/Martin-Mack/2/,更改地址栏中的URL。

然后以内部重写更好看的URL和路由回PHP脚本:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^/?([^/]+)/([^/]+)/([0-9]+)/?$ /profile.php?county=$1&name=$2&id=$3 [L] 

此正好相反,但仅在内部,这样在浏览器的地址栏中的URL保持不变,而内容来自profile.php

0

如果您的重写是在或htaccess中,它将与“profile.php”进行比较,因此中间的/不能匹配,更不用说最后的第二个斜线。