我有这种重写条件,将所有不存在文件的请求重定向到父目录中的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值?
答案 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
等代替。