1

我一直在想弄清楚为什么我的 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]

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

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

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

5 回答 5

2

不是该问题的确切答案,但总体上可能有用;您可以打开重写日志记录,这可以帮助追踪问题。

Apache 2.2中:

RewriteLog com.example_rewrite.log 
RewriteLogLevel 3

Apache 2.4中的语法略有变化。

于 2012-10-22T09:08:36.787 回答
1

这对我有用:

.htaccess

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

配置文件.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

在 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
于 2012-10-22T08:48:39.760 回答
0

你的规则非常接近。

 RewriteRule ^([^/]+)/([^/]+)/?$ /profile.php?county=$1&name=$2&id=1 [L]
  • 我认为塞缪尔库克先生谈到了你的问题——你的规则需要一个斜杠。?在规则中的尾部斜杠之后添加允许带有它的 URL 和不带有它的 URL。

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

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

于 2012-10-19T14:29:21.783 回答
0

此答案的顶部阐明了 URL 如何被重写重定向。那里发生了两种完全不同的事情。

要将 URL 更改为/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也需要是 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.

于 2012-10-22T09:29:41.717 回答
0

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

于 2012-10-22T12:51:28.447 回答