mod_rewrite:通过.htaccess设置自定义标头

时间:2015-12-07 00:52:01

标签: php apache .htaccess mod-rewrite

我有这种重写条件,将所有不存在文件的请求重定向到父目录中的app.php。

Options -MultiViews
RewriteEngine On


RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond $1#%{REQUEST_URI} ([^#]*)#(.*)\1$ 
RewriteRule ^(.*)$ %2../app.php [L]

在最后一行(rewriterule)中,$ 1的值是相对于.htacces所在的目录的路径,以便使其可移植(在此处找到:http://linlog.skepticats.com/entries/2014/08/Using_RewriteBase_without_knowing_it.php)。

那就是:调用http://localhost/myapp/public/test123/r.txt我会在$ 1变量中获得test123 / r.txt(考虑到.htaccess是公开的/)。

我想将$ 1的值传递给app.php,一个常见的解决方案是将其作为查询字符串追加:

RewriteRule ^(.*)$ %2../app.php?__path=$1 [L]

通过这种方式,我将__path作为GET变量(PHP:$ _REQUEST [" __ path"]),但它如何与其他类型的请求(如查询字符串不应该存在)一起工作?

更干净的解决方案是将$ 1放入HTTP自定义标头中,但是,如何设置自定义标头,通过.htacess将MYAPP_PATH设置为$ 1值?

1 个答案:

答案 0 :(得分:1)

从评论开始:

  

我注意到了这个技巧?__ path = $ 1会覆盖我在原始网址中传递的所有查询字符串。

You forgot to set the QSA flag

第二个核心问题:

  

通过这种方式,我将__path作为GET变量(PHP:$ _REQUEST [" __ path"]),但它如何与其他类型的请求(如查询字符串不应该存在)一起工作?

这很好用。 GET参数通常被称为,它们实际上是查询字符串参数,并且可以与任何HTTP动词一起传递,从GET和POST到PUT和DELETE。因此,如果您使用查询字符串参数POST到URL,您仍然可以从$_GET读取它们。

最后一点,因为上述内容解决了您的所有问题:请不要使用$_REQUEST。这真的是真的糟糕的做法,可能导致隐藏的安全性和稳定性问题。只需使用$_POST$_GET等代替。