RewriteEngine URL到php _get参数

时间:2019-05-28 11:13:37

标签: php .htaccess

在我的网站上,我想内部执行一个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]

1 个答案:

答案 0 :(得分:0)

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

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

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

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

2)使用END标志,该标志由apache http服务器的较新版本提供:

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

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

还有一个一般性说明:您应该始终喜欢将此类规则放置在http服务器主机配置中,而不要使用动态配置文件(“ .htaccess”)。这些动态配置文件增加了复杂性,通常是导致意外行为,难以调试的原因,并且确实降低了http服务器的速度。仅当您无法访问真正的http服务器主机配置(阅读:真正便宜的服务提供商)或坚持编写自己的规则的应用程序(这显然是安全的噩梦)时,才提供它们作为最后的选择。