Apache mod_rewrite .htaccess

时间:2008-11-03 17:33:35

标签: apache .htaccess mod-rewrite url-rewriting

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

// 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

但是,当您使用“漂亮网址”(例如http://example.com/location/90210)时,它没有将GET位置变量传递到/location/index.html页面。

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

2 个答案:

答案 0 :(得分: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'] . '.';
?>

与重写相结合时,对于网址http://www.example.com/location/Houston,TX,它会打印出来:

The location you entered is Austin,TX.

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

答案 1 :(得分:0)

重申一下,Piskvor发布的解决方案确实按预期工作。根据对此的评论,您使用javascript来获取查询字符串,这就是问题所在。就javascript而言,原始URL是它看到的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