重写引擎 URL 到 php _get参数



在我的网站上,我想在内部执行一个像mydomain.com/dir/test这样的网址mydomain.com/dir/process.php?arg=test

我已经在文件夹"dir"中创建了一个htaccess文件,当我尝试访问mydomain.com/dir/test时,它会显示process.php的页面,但是当我尝试访问$_GET["arg"]时,它不包含字符串test而是字符串process.php

我的.htaccess:

RewriteEngine On
RewriteRule ^(.*)$ process.php?arg=$1 [L]

结果的原因是重写循环。您尝试使用[L]标志停止重写过程,但您错过的许多其他人都了解该标志的实际作用。它不会结束重写过程,而只会结束该过程的当前运行。在您的情况下,重写过程将开始另一次运行,并再次重写已重写的请求。在第二次运行中,模式^(.*)$与您在第一次运行中重写的内容相匹配,这解释了您的结果。

您有两种选择来解决此问题。

1) 使用条件来防止第二次重写运行:

RewriteEngine On
RewriteCond %{REQEUEST_URI} !/process.php$
RewriteRule ^(.*)$ process.php?arg=$1 [L]

2) 使用较新版本的 Apache HTTP 服务器提供的END标志:

RewriteEngine On
RewriteRule ^(.*)$ process.php?arg=$1 [END]

如果您使用上面的第二条规则收到内部服务器错误(http status 500),那么您很可能操作的是旧版本的apache http服务器。在这种情况下,您将在 http 服务器错误日志文件中看到不受支持的[END]标志的明确提示。

一般评论:您应该始终倾向于将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件(".htaccess")。这些动态配置文件增加了复杂性,通常是意外行为的原因,难以调试,并且它们确实会减慢 http 服务器的速度。它们仅作为最后选项提供,用于您无法访问真正的http服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)。

最新更新