【问题标题】:combine .htaccess RewriteRule结合 .htaccess RewriteRule
【发布时间】:2013-02-03 03:42:01
【问题描述】:

我正在使用 .htaccess mod_rewite 指令并想要完成 2 件不同的事情:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?unit=/$1 [PT,L]

上面采用指定的 URL 并让我通过我的 index.php 引导页面引导它。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

以上内容使我的文件可以在没有 .php 扩展名的情况下显示。

使用它,我可以使用 url /module/function/setting 指定一个文件,它包括引导页面上的路径以加载 [root]/module/function/setting.php

我需要将这两个动作组合成一个语句,有人可以帮忙吗?

【问题讨论】:

  • 这似乎不需要。请求 example.com/page.php 不正确。为什么不干脆完全忽略“.php”,然后在脚本加载后附加它呢? $file = getenv('REQUEST_URI') . '.php'; ? (注意请确保您不仅仅包含基于原始 URL 的内容!)
  • 好的,我明白了,是的,这是一个选项。出于兴趣,您为什么选择将 REQUEST_URL 设置为环境变量?当然,Env 最适合开发/生产状态等静态方面?如何清理原始 URL,我可以使用 PHP 过滤器吗?
  • getenv() 函数允许您安全地访问$_SERVER 变量,因为 Web 服务器会自动设置它们。 $url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : NULL;$url = getenv('REQUEST_URI');
  • 但是$_ENV 变量是否比使用$_GET 或简单地获取index.php 上的URL 更合适?我认为$_ENV 在概念上是为为系统设置设计的静态变量而保留的。

标签: apache .htaccess php httpd.conf


【解决方案1】:

只需将第二条规则放在第一条之前:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^ %{REQUEST_URI}.php [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?unit=/$1 [PT,L]

因此 htaccess 将检查具有名称(不带扩展名)的脚本是否存在并执行它。如果不是,您的当前规则将被执行。

【讨论】:

  • 这似乎没有什么大的区别,url没有添加.php。
  • 输入 example.com/foo 应该不会明显改变,但应该指向 example.com/index.php/foo.php 并且 example.com/foo/bar 应该转到 example.com/index。 php/foo/bar.php - 我可以使用$_SERVER['REQUEST_URI'] 获取 index.php (引导文件)上的 /foo/bar.php 并带来该内容 - 这样我就可以设置变量并拥有一致的加载方法页面
  • 当导航到 example.com/foo/bar 并使用 print($_SERVER['REQUEST_URI']) 我仍然得到 /foo/bar 而不是 /foo/bar.php 但也许更简单的方法是简单地收到后将.php 附加到$_SERVER['REQUEST_URI'] 的末尾?
  • 试试我最少的更新。但是是的,可以附加后缀:$_SERVER['REQUEST_URI'].=".php";
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 2014-12-18
相关资源
最近更新 更多