URL重写不起作用?

时间:2012-10-19 14:00:14

标签: apache url-rewriting

我一直在努力弄清楚为什么我的网址重写不起作用!

我目前正在使用

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]

我被重定向到谷歌,所以我知道它必定是我正在做的事情。

我试图重写的网址是......

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

5 个答案:

答案 0 :(得分:2)

这个问题不是一个确切的答案,但总的来说可能有用;您可以打开重写日志记录,这有助于追踪问题。

Apache 2.2中:

RewriteLog com.example_rewrite.log 
RewriteLogLevel 3

语法在Apache 2.4中略有变化。

答案 1 :(得分: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

制作此HTML:

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

Rendering in Opera

在Apache 2.2.21和PHP 5.3.10上测试。


在我的测试中,我将两个文件放在http://localhost/tests/htaccess_test/中,但您可以将它们放在您想要的位置;他们只需要在同一个文件夹中。

例如,在您的情况下,您应该将文件放在网站的根目录中,这样当您访问http://www.yoursite.com/Cheshire/Martin-Mack时,重定向就会起作用。

如果仍然无法让它发挥作用,请尝试在RewriteBase /之后立即添加RewriteEngine On

完整示例:

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

更新:在原始代码中,id参数是静态的。为了让它也能正常工作,试试这个:

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

答案 2 :(得分:0)

你的规则非常接近。

 RewriteRule ^([^/]+)/([^/]+)/?$ /profile.php?county=$1&name=$2&id=1 [L]
  • 我认为Samuel Cook先生谈到了你的问题 - 你的规则需要一个尾随的斜线。在规则中的尾部斜杠之后添加?允许包含它的URL和不包含它的URL。

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

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

答案 3 :(得分:0)

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

要将/profile.php?county=foo&name=bar&id=1234之类的网址更改为更好看的版本,您需要根据实际请求进行匹配并重定向浏览器:

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

请注意, id 也需要成为网址的一部分(通过%4反向引用)。这样,当有人在浏览器中输入网址http://mysite.com/profile.php?county=Cheshire&name=Martin-Mack&id=2时,他们会从外部重定向到http://mysite.com/Cheshire/Martin-Mack/2/,从而更改地址栏中的网址。

然后,为了在内部重写看起来更漂亮的URL并将其路由回php脚本:

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

相反,但仅在内部,以便在从profile.php提供内容时,浏览器地址栏中的网址保持不变。

答案 4 :(得分:0)

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