2011-05-16 82 views
4

我很想获得关于此的一些反馈。我不确定这是否正确。检查cookie并重定向到Apache

细节

我运行的Apache 2的PHP 5.3/MySQL的4和Drupal 6的平台。

我正在开发一个网站,其中包含几个选定城市的餐厅评论。 当用户到达该网站时,它可以选择哪个城市是他们的。我将他们的选择存储在一个cookie中,如果他们没有做出选择,我选择了一个默认城市。

提出的解决方案

现在我想要的网址mydomain.com/reviews重定向到基于自己的城市选择城市的具体URL。例如mydomain.com/reviews/paris,如果我选择了巴黎作为我的城市。 (如果没有cookie设置,它应该重定向到默认城市。)

我认为这是最好的选择,因为我希望用户能够在不改变城市的情况下在其他城市查看评论。如果他们想查看伦敦餐厅的评论,他们可以直接进入mydomain.com/reviews/london。

为了获得最佳性能,我正考虑让Apache检查cookie并在用户转到mydomain.com/reviews时将重定向到正确的城市。

因此,这里是我的问题...

  1. 我如何配置Apache要做到这一点?
  2. 这是最好的方式吗?

回答

4
  1. 要配置Apache来执行此操作,请使用以下代替cookie名称。

    RewriteEngine on 
    RewriteCond %{REQUEST_URI} ^/reviews/?$ 
    RewriteCond %{HTTP_COOKIE} <cookie>=([^;]+) 
    RewriteRule .* http://mydomain.com/reviews/%1 [R=302,L] 
    
  2. Yelp的存储在cookie中的位置,所以我把它看作一个好兆头,因为他们有一吨的流量,而且似乎做得很好。

有优点和缺点,使用Apache做重定向,但主要的反面的,是它更容易维护重写规则在你的代码,而不是在服务器上。您可以快速进行修复和部署,而无需更改和重新启动所有Apache服务器。

+0

谢谢!如果用户没有使用Apache,我可以在Apache中设置默认cookie(比如“paris”)吗? – 2011-05-17 13:47:08

+0

你可以使用Set-Cookie,这里http://httpd.apache.org/docs/2.3/mod/mod_headers.html记录下来,但如果我是你,我会在你的代码中做到这一点。 – toneplex 2011-05-17 19:00:55

+0

用您希望获取其值的cookie的名称替换。还有一件事让我想起了这件事,%1反向引用只对最后一个RewriteCond有效,我之间有一条规则,无法让它正常工作。 – DrCord 2013-10-11 20:20:15

0
<?php 
    $city = $_COOKIE['city']; 

    header("Location: mydomain.com/reviews/".$city); 
?> 

您不需要配置Apache。

+2

感谢您的回复之前的最后两行,但我宁愿留出PHP的这一点。我为静态HTML用于匿名用户的缓存页面。我忘了提及那个,对不起...... – 2011-05-17 13:45:20

0

如果在重写规则中没有直接设置cookie,还有一种方法可以给出自定义默认值!

%1总是指最后的RewriteCond评估! 如果找到cookie,则会忽略第二个RewriteCond。 如果没有找到,则评估第二个。它所做的就是给出一个值,然后匹配这个整体值!

RewriteEngine on 
RewriteCond %{HTTP_COOKIE} cookiename=([^;]+) [OR] 
RewriteCond defaultvalue (.*) 
RewriteRule ^(.*)$ /mypath/%1 [L,R=302] 

您可以添加其他RewriteCond检查,但是这必须是最后RewriteRule