2009-07-12 75 views
0

我有一个讨厌的问题。我有一个脚本,它使用PHP的$ _GET功能从页面的url获取变量。不过,我需要知道如何,首先,让我的网页网址

http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse

http://www.example.com/something/dir2/somethingelse/page.php

这是混淆了我。

现在,这里是艰难的部分:我如何$ _GET值和另一个值,同时保留page.php结束时任何其他的url值完好无损?另外,如果用户访问http://www.example.com/something/dir2/somethingelse/page.php,他们将显示http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse的内容,反之亦然,对吗?

这对我的网站的运作非常重要,感谢您的帮助!我根本不了解.htaccess,但我知道可以做到这一点。

为了澄清,从长远来看,做这件非常令人困惑的事情实际上会让事情变得更简单,因为它将需要更少的重新编码,并且会提供更清晰的URL。

回答

2

这个规则应该这样做:

RewriteCond %{REQUEST_URI} !^/dir/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/(.*) dir/$2/$4?value=$1&anothervalue=$3 [L,QSA] 

它将改写/something/dir2/somethingelse/page.php内部的请求来/dir/dir2/page.php?value=something&anothervalue=somethingelse

但是,这不会阻止直接请求后者,而只是允许别名。

重定向的/dir/dir2/page.php?value=something&anothervalue=somethingelse内外兼修/something/dir2/somethingelse/page.php请求,也可以与mod_rewrite的,但需要更多一点的复杂的规则,因为URL参数可以是任意的顺序:

RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)value=([^&]+)&?([^&].*)?$ 
RewriteCond %3&%1%4 ^([^&]+)&(([^&]*&)*)anothervalue=([^&]+)&?([^&].*)?$ 
RewriteRule ^dir/([^/]+)/(.*) /%1/$1/%4/$2?%2%5 [L,R=301] 

正如你看到的,这不是真的很好。更好的解决方案是使用PHP检查请求的URL(请参阅$_SERVER['REQUEST_URI'])并使用PHP重定向(请参阅header function)。

2

你是对的,有可能做到这一点。其他人可能会不同意,但我倾向于认为你所处位置的适当的事情是引用你到the documentation for mod_rewrite。如果你将要维护一组重写的复合体,那么迟早你需要了解它,所以现在可能是这样。

+0

哈哈,很高兴知道这是可能的。 我做了一个妥协,如果我通读文档,你会提供给我实际的代码?感谢您的帮助:D – Cyclone 2009-07-12 01:32:30

1

为您带来以上的特定重写,这样的事情应该工作:

RewriteEngine On 
RewriteRule ^/(.*)/(.*)/(.*)/(.*)\.php$ /dir/\2/\4.php?value=\1&anothervalue=\3 [L] 

...虽然在实践中我不会建议使用点标记如图所示,因为它会配合额外的路径在他们的水平,并搞砸了重写。用[^/]替换每个点可能会有效,尽管我希望有人比我更喜欢正则表达式,然后确定是否有任何陷阱。无论如何,重要的一点是正则表达式可能非常复杂而且非常强大,对它们的完整解释超出了这个答案的范围。尝试花一些时间在http://www.regular-expressions.info一般教程。

此外,如果用户访问http://www.example.com/something/dir2/somethingelse/page.php他们必为http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse内容,反之亦然,对不对?

否;它只能用一种方式。要做到这一点,你需要两个RewriteRules。

我不确定我了解你对$ _GET的问题。 $ _GET是一个数组,其中填充了URL中每个参数的键/值对;你可以根据需要使用尽可能多的或尽可能少的数字。它不具有破坏性 - 使用它不会改变URL字符串的参数。

+0

好的,谢谢。所以,如果我使用代码:$ _GET ['value'],它会返回一些东西,即使重写? – Cyclone 2009-07-12 02:42:30

+0

有人真的需要在php中创建一个Mod_Rewrite脚本,它将自己做这样的事情..... – Cyclone 2009-07-12 02:43:40