繁体   English   中英

.htaccess 使用 RewriteRule 将 url 重定向到 PHP

[英].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

.htaccess 文件:

RewriteEngine on
RewriteRule ^(.*)$ io.php?id=$1

io.php 文件:

<?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

原因是您的规则执行了两次,因为没有不重写现有文件和目录的先决条件。

  1. 第一次匹配abc123并重写为io.php?id=abc123
  2. 现在我们的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM