Php htaccess使用get参数重写和重定向

Php htaccess使用get参数重写和重定向,php,.htaccess,url,get,wamp,Php,.htaccess,Url,Get,Wamp,我已经尝试了在这里能找到的一切。可能是我的wamp配置,也可能是网站不在根目录下,我不知道。基本上有些东西管用,有些不管用 我想要实现的是删除index.php和all.php扩展名,并强制在末尾添加一个尾随的斜杠/ 另外,我想在第二个“/”之后传递一个GET参数 比如说 localhost/index.php->localhost/ localhost/search.php->localhost/search/ localhost/search.php?d=1->localhost/searc

我已经尝试了在这里能找到的一切。可能是我的wamp配置,也可能是网站不在根目录下,我不知道。基本上有些东西管用,有些不管用

我想要实现的是删除index.php和all.php扩展名,并强制在末尾添加一个尾随的斜杠/

另外,我想在第二个“/”之后传递一个GET参数

比如说

localhost/index.php->localhost/
localhost/search.php->localhost/search/
localhost/search.php?d=1->localhost/search/1/

我的httpd-vhosts.conf:

# Virtual Hosts
#
<VirtualHost *:80>
  ServerName localhost
  ServerAlias localhost
  DocumentRoot "${INSTALL_DIR}/www"
  <Directory "${INSTALL_DIR}/www/">
    Options +Indexes +Includes +FollowSymLinks +MultiViews
    AllowOverride All
    Require local
    RewriteEngine On
    RewriteRule ^/?payday/$ /index.php [END]
    RewriteRule ^/?payday/(\w)/?$ /$1.php [END]
    RewriteRule ^/?payday/(\w)/([^/])/?$ /$1.php?param=$2 [END]
  </Directory>
</VirtualHost>

实现这一组合的最佳方法通常是逐个执行:

RewriteRule ^/?$ /index.php [END]
RewriteRule ^/?(\w+)/?$ /$1.php [END]
RewriteRule ^/?(\w+)/(\w+)/?$ /$1.php?param=$2 [END]
您可能能够更精确地了解http GET参数。如果它始终是一个典型的数字ID,则使用更精确的模式
^/?(\w)/([0-9])/?$
,这将加快速度

如您所言,尽管您的问题在这里是矛盾的,但如果您的应用程序逻辑不是放在
DOCUMENT_ROOT
文件夹中,而是放在子文件夹中,则实施特定规则,并将动态配置文件(.htaccess)保留在顶层。防止意外行为的方法:

RewriteRule ^/?subfolder/?$ /index.php [END]
RewriteRule ^/?subfolder/(\w+)/?$ /$1.php [END]
RewriteRule ^/?subfolder/(\w+)/(\w+)/?$ /$1.php?d=$2 [END]
如果您使用上述规则收到一个内部服务器错误(http状态500),那么很可能您操作的是非常旧版本的apache http服务器。在这种情况下,您将在http服务器错误日志文件中看到不支持的
[END]
标志的明确提示。您可以尝试升级或使用较旧的
[L]
标志,在这种情况下可能也会使用相同的标志,不过这取决于您的设置

此实现将在http服务器主机配置中或在动态配置文件(“.htaccess”文件)中同样工作。显然,重写模块需要在http服务器中加载,并在http主机中启用。在使用动态配置文件的情况下,您需要注意在主机配置中启用该文件的解释,并且该文件位于主机的
DOCUMENT\u ROOT
文件夹中


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

也许你不会听到答案,但这是一个不错的URL解决方案。可以随意调整和扩展代码

对于我的网站(这里是ct.wiimm.de),我使用:


然后PHP将提供所有不带后缀的链接。

感谢您的快速回复。我做的第一件事是重新安装我的wamp服务器,现在apache是2.4.41。然后我检查了.htaccess文件是否能正常工作,如果我破坏了它,我会得到一个错误。我下载了不同的浏览器,以防它被缓存。我用[L]和[END]标志试过了。它仍然只删除.php扩展名,不强制使用斜杠,也不传递GET参数。为什么要强制使用尾随斜杠?为何我发布的规则同样接受这两个版本,带或不带尾随斜杠。因为这并不真正包含信息,所以坚持这样做没有什么意义……哦,对不起,我将参数命名为“param”,只是现在我看到您在问题中将其命名为“d”。我相应地修改了规则。不,名称不是问题,我根本没有获取任何get参数。你编辑了你的问题并发布了一个静态和动态配置文件。两者都实现相同的重写规则。这没有道理。如果您可以访问服务器配置(显然是这样),那么使用动态配置文件(“.htacces”)是没有意义的。我在回答中解释了这一点。
RewriteRule ^/?subfolder/?$ /index.php [END]
RewriteRule ^/?subfolder/(\w+)/?$ /$1.php [END]
RewriteRule ^/?subfolder/(\w+)/(\w+)/?$ /$1.php?d=$2 [END]
RewriteEngine on

# Rewrite base path (not really needed, but helpful on conflicts)
RewriteRule ^$ index.php [L]

# for pages with sub-path support
# -> eg.g This allows /stat/a/b/c to be send to /stat.php
RewriteRule ^((stat|tdis)/[^/.]*)/(.*) /$1.php/$3 [L]

# add .php, if not found but .php exists
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .* $0.php [L]

# redirect to main index.php, if nout found
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]