![](/img/trans.png)
[英]Using redirect 301 or rewriterule in htaccess to redirect and take a php variable with you
[英].htaccess redirect a url to PHP using RewriteRule
尝试设置 .htaccess 以便我可以将像http://example.com/io/abc123
这样的网址重定向到http://example.com/io/io.php?id=abc123
。 但是,出于某种原因,RewriteRule 并没有像我预期的那样工作。
我想将此重定向保留在本地,而不会弄乱根 .htaccess 文件,因此我在 io 子目录中创建了一个新的 .htaccess 文件。 (在根目录中执行相同的操作会产生相同的结果,因此并非如此)。
www
|
+--io
|
+-- .htaccess
\-- io.php
RewriteEngine on
RewriteRule ^(.*)$ io.php?id=$1
<?php
echo "Hello World" . "\n";
echo "REQUEST_URI=[" . $_SERVER['REQUEST_URI'] . "]\n";
echo "PHP_SELF=[" . $_SERVER['PHP_SELF'] . "]\n";
echo "QUERY_STRING=[" . $_SERVER['QUERY_STRING'] . "]\n";
$id = $_GET['id'];
echo "id='" . $id . "'\n";
?>
Hello World
REQUEST_URI=[/io/abc123]
PHP_SELF=[/io/io.php]
QUERY_STRING=[id=io.php]
id='io.php'
由于我不明白的原因,而不是预期的id=io.php
id=abc123
这导致id=io.php
。
很明显,目标文件io.php
的重写正确,但未能使用 $1 将abc123
替换为 id 参数。
我究竟做错了什么?
由于我不明白的原因,而不是预期的 query_string id=abc123 这导致 id=io.php
原因是您的规则执行了两次,因为没有不重写现有文件和目录的先决条件。
abc123
并重写为io.php?id=abc123
REQUEST_URI
变成了io.php
。 mod_rewrite
循环运行,除非没有执行规则或者源和目标 URI 相同。 所以第二次它匹配io.php
(因为我们的模式是.*
)并且它被重写为io.php?id=io.php
。 mod_rewrite
引擎在这里停止,因为源和目标 URI 是相同的。
要解决此问题,您应该使用:
RewriteEngine On
# If the request is not for a valid file
RewriteCond %{REQUEST_FILENAME} !-f
# If the request is not for a valid directory
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ io.php?id=$1 [L,QSA]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.