【问题标题】:htaccess rewriting and redirecting with get parametershtaccess 使用获取参数重写和重定向
【发布时间】:2020-04-13 18:34:50
【问题描述】:

我已经尝试了在这里能找到的所有东西。也许是我的 wamp 配置,或者该网站不在 root 中,我不知道。基本上有些东西有用有些没用。

我想要实现的是完全删除 index.php 和所有 .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>

我的 .htaccess :

RewriteEngine On

RewriteRule ^/?payday/$ /index.php [END]
RewriteRule ^/?payday/(\w)/?$ /$1.php [END]
RewriteRule ^/?payday/(\w)/([^/])/?$ /$1.php?param=$2 [END]

【问题讨论】:

    标签: php .htaccess url get wamp


    【解决方案1】:

    实现这种组合的最佳方法通常是一件一件地做:

    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_ROOT 文件夹中。

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

    【讨论】:

    • 感谢您的快速回复。我做的第一件事是重新安装我的 wamp 服务器,现在 apache 是 2.4.41。然后我检查了 .htaccess 文件是否可以正常工作,如果我破坏它,我会收到错误消息。我下载了不同的浏览器以防它被缓存。我已经尝试使用 [L] 和 [END] 标志。它仍然只删除 .php 扩展名,不强制使用斜线并且不传递 GET 参数。
    • 为什么要强制使用斜杠?做什么的?我发布的规则同样接受 both 版本,带或不带斜杠。由于这并没有真正携带信息,因此坚持这一点毫无意义......
    • 哦,对不起,我将参数命名为“param”,现在我才看到您在问题中将其称为“d”。我相应地更改了规则。
    • 不,名字不是问题,我根本没有得到任何获取参数
    • 您编辑了问题并发布了静态和动态配置文件。两者都实现相同的重写规则。那没有意义。如果您有权访问服务器配置(显然您有),那么使用动态配置文件(“.htacces”)是没有意义的。我在答案中解释了这一点。
    【解决方案2】:

    也许不是您会听到的答案,而是漂亮 URL 的解决方案。随意调整和扩展代码。

    对于我的网站(此处为 ct.wiimm.de),我使用:

    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]
    

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

    【讨论】:

      猜你喜欢
      • 2016-07-29
      • 2017-09-20
      • 2015-04-27
      • 2019-03-26
      • 2017-06-16
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 2014-05-25
      相关资源
      最近更新 更多