0

我希望能够从以下位置重写 URL:

// examples

http://example.com/location/New York, NY  -->
http://example.com/location/index.html?location=New York, NY

http://example.com/location/90210  -->
http://example.com/location/index.html?location=90210

http://example.com/location/Texas -->
http://example.com/location/index.html?location=Texas

http://example.com/location/ANYTHING....  -->  
http://example.com/location/index.html?location=ANYTHING...

使用.htaccess和 mod_rewrite。

有人知道怎么做吗?

我努力了:

RewriteEngine on
RewriteCond %{REQUEST_URI} !location/index.html
RewriteRule ^location/(.*)$ /location/index.html?location=$1

但是,当您使用“漂亮的 url”(例如http://example.com/location/90210)时,它不会将 GET 位置变量传递给 /location/index.html 页面。

我知道这个 b/c 当我在屏幕上回显时(使用 javascript)位置 GET 变量在使用长 url 时已设置,但当使用漂亮(短)url 时,位置 GET 变量未定义。

4

2 回答 2

3

你的最后一个例子应该有效;我还要检查条件是否区分大小写(以避免 /LoCation/indeX.htmL 被解析),用 [L] 终止重写(以防止无限循环)并添加 QSA(用于附加查询):

RewriteEngine on
RewriteCond %{REQUEST_URI} !location/index.html [NC]
RewriteRule ^location/(.*)$ /location/index.html?location=$1 [L,QSA]

您如何读出(并回显)位置 GET 变量?“我正在使用 JavaScript 来回显一个打印“位置”变量的警报。”

JavaScript 在您的浏览器中运行(“客户端”),因此它与您的浏览器看到的相同数据一起工作。即,如果您将浏览器指向http://www.example.com/foo/bar/,那么无论您在服务器上使用什么重写,Javascript 仍然会将“ http://www.example.com/foo/bar/”视为位置。

要访问 GET 变量,您需要一些代码在页面生成(“服务器端”)时访问它们,然后再将其发送到浏览器。例如,当您有一个支持 PHP 的服务器时,http://www.example.com/location/index.php上的以下脚本并通过类似上述代码的方式重定向到它,它将能够访问和使用 GET 变量:

<?php
echo 'The location you entered is ' . $_GET['location'] . '.';
?>

当与重写结合使用时,对于 URL http://www.example.com/location/Houston,TX,它将打印出以下内容:

The location you entered is Austin,TX.

(当然,服务器端语言有很多,我以我最熟悉的PHP为例)

于 2008-11-03T17:47:49.257 回答
0

重申一下,Piskvor 发布的解决方案确实按预期工作。根据对此的评论,您正在使用 javascript 来获取查询字符串,这就是问题所在。就 javascript 而言,原始 URL 就是它看到的那个。您可以自己快速确认这一点:

alert(document.location.href);

如果您需要在 javascript 中获取值,我建议使用类似的东西:

var regex = /location\/(.*)$/;
var query = document.location.href.match(regex);
alert(query[1]);

// query[1] will contain "90210" in your example
// http://example.com/location/90210
于 2008-11-03T19:07:38.380 回答