.htaccess和$ _GET重写

时间:2009-07-12 01:24:23

标签: php .htaccess mod-rewrite

我有一个恼人的问题。我有一个脚本,它使用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。

3 个答案:

答案 0 :(得分:2)

你是对的,有可能做到这一点。其他人可能不同意,但我倾向于认为,你所处的恰当之处在于引用你the documentation for mod_rewrite。如果您要维护一组重写的复杂性,那么您迟早需要了解它,所以它现在可能也是如此。

答案 1 :(得分: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

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

使用mod_rewrite也可以将/dir/dir2/page.php?value=something&anothervalue=somethingelse外部的请求重定向到/something/dir2/somethingelse/page.php,但需要更复杂的规则,因为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 :(得分: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字符串的参数。