【问题标题】:URL directory as variable with htaccess使用 htaccess 作为变量的 URL 目录
【发布时间】:2012-10-18 13:14:09
【问题描述】:

我实际的 .htaccess 是

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([_0-9a-zA-Z-]+)? index.php?cl=$1 [L]

当我键入 sub.domain.com/client1 之类的内容时它工作得很好(然后我在我的 php 代码中正确获取了 $cl 变量)。问题是当我添加一个像 sub.domain.com/client1/ 这样的最后一个斜杠时,我会在我的 var 中得到“client1/”!

我该如何解决?我知道我的 htaccess 中的第二个条件会查找现有目录并跳过重写规则,但我的服务器上没有“client1”目录!

【问题讨论】:

    标签: php .htaccess mod-rewrite


    【解决方案1】:

    “问题是当我添加一个像 sub.domain.com/client1/ 这样的最后一个斜杠时,我会在我的 var 中得到“client1/”!”

    这是预期的行为。之后您需要通过 PHP 去除斜线:

    $cl = trim( $_REQUEST['cl'], '/' );
    

    或者您将值分解以获取所有文件夹(如果斜线后有另一个名称)

    $cl = explode( '/', $_REQUEST['cl'] );
    

    【讨论】:

    • 问题是我在 html 页面(js、css 等)中有很多相对 url,它们指的是 client1/ 目录而不是根目录!而且我不能在这些网址中使用绝对网址(由于某些原因我现在无法解释)
    • @user1753054 什么?您说您的服务器上没有目录client1。脚本如何驻留在该目录中?为什么不在你的 HTML 中设置一个 <base href="…"> head
    • @user1753054 Ähm,哪一项更改对您有帮助?
    • 我在头部使用了 并且它有效!我的 htaccess 和开头一样
    【解决方案2】:

    只要求匹配消耗整个 URL 路径:

    # Note the trailing $ on the pattern
    RewriteRule ^([_0-9a-zA-Z-]+)?$ index.php?cl=$1 [L]
    

    就目前而言,您的模式会检查请求路径是否以(可选)一个或多个字母、数字和/或下划线和破折号字符开头 - 但它不会以其他方式限制自身。所以它会匹配a/b/c/d/e/f/g 而不会抱怨。如果变量应该包含模式以外的任何内容,添加$(在这种情况下表示“字符串结尾”)会限制您的匹配。

    【讨论】:

    • 我已经尝试在末尾添加 $ 但它返回 404 页面!请记住,htaccess 在子域中(即在服务器的目录中,而不是在根目录中)。这可能是问题吗?
    【解决方案3】:

    我正在尝试做一些非常相似的事情,这对我有用:

    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^$
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    RewriteRule ^([^\/]+)$ index.php?arg1=$1&arg2=default [L]
    RewriteRule ^([^\/]+)\/$ index.php?arg1=$1&arg2=default [L]
    RewriteRule ^([^\/]+)\/([^\/]+)$ index.php?arg1=$1&arg2=$2 [L]
    RewriteRule ^([^\/]+)\/([^\/]+)\/$ index.php?arg1=$1&arg2=$2 [L]
    

    如果找到条件,重写规则将退出,因此这会逐步检查每个较长的 URL 路径。

    不是只过滤“_0-9a-zA-Z-”字符,而是允许所有字符不是“/”,因为在每个参数之间我寻找文字“/”。

    您可以根据需要将其扩展为尽可能多的参数。对于超出此规则接受的参数数量的 URL,应将用户带到由您的根 .htaccess 设置的错误 404 页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 2016-11-30
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多