Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否可以使用.htaccess重写目录?_Php_Apache_.htaccess - Fatal编程技术网

Php 是否可以使用.htaccess重写目录?

Php 是否可以使用.htaccess重写目录?,php,apache,.htaccess,Php,Apache,.htaccess,我想知道是否可以使用.htaccess重写文件夹名。我的意思是这个 假设浏览器中的用户类型url: https://example.com/categoryxxx/dir1/dir2/?param=aaa#hash=xxx 在后台(服务器): 此(根/categoryxxx/dir1/dir2/)不存在 此文件夹改为存在(root/dir1/dir2/categoryxxx/) 因此,请求将被传递到该文件夹 用户仍在浏览器中看到此url(用户没有任何更改): 如何在htaccess中执行此操作

我想知道是否可以使用.htaccess重写文件夹名。我的意思是这个

假设浏览器中的用户类型url:

https://example.com/categoryxxx/dir1/dir2/?param=aaa#hash=xxx
在后台(服务器):

此(根/categoryxxx/dir1/dir2/)不存在

此文件夹改为存在(root/dir1/dir2/categoryxxx/)

因此,请求将被传递到该文件夹

用户仍在浏览器中看到此url(用户没有任何更改):

  • 如何在htaccess中执行此操作?如果不可能的话,还有其他方法吗
  • 我的php[REQUEST_URI]会返回输入的用户还是服务器中的文件?有可能绕过去吗
  • 注:
    它不仅仅是示例com/categoryxxx/dir1/dir2/它还可以是示例com/categoryxxx/dir1/dir2/dir3(dir的数量是随机的)

    这可能就是您正在寻找的:

    RewriteEngine on
    RewriteCond %{REQUEST_URI} !-f
    RewriteCond %{REQUEST_URI} !-d
    RewriteRule ^/?(categoryxxx)((?:/(?:[^/]+))+)/?$ /$2/$1 [END,QSA]
    
    实现这样的重写规则不会改变超全局php变量
    $\u REQUEST
    中的条目。因此,
    $\u请求['REQUEST\u URI']
    仍将包含“/categoryxxx/dir1/dir2/”,这绝对有意义

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

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


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

    这听起来好像你没有读过任何关于请求重写的教程,没有读过文档,没有看过任何例子。为什么不呢?别搞错了,我不是在嘲笑你或其他什么。但是请理解,对于你在这里提出的问题,有无数的解释。你还是问这个问题,如果可能的话……嗨,谢谢。但这不起作用。它会将其他文件夹重写为0。不仅仅是“categoryxxx”,请看注释。读标题时听起来很容易。但当你阅读下面的注释时,它并不是那么简单。我更新了Matching模式,以接受初始文件夹之后的任意路径级别。另一个更新修复了实际文件夹名称“categoryxxx”(这是我从你的评论中理解的,尽管我无法理解“0”)。在我理解这个问题之前,第一个文件夹名也是任意的。嗨,谢谢。这几乎奏效了。但仍然显示404,因为它在内部(不存在):ROOT/dir1/dir2/?param1=value1我想要的是:ROOT/dir1/dir2/categoryxxx/?param1=value1,所以“categoryxxx”从dir路径的“第一部分”更改为dir路径的“最后一部分”
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !-f
    RewriteCond %{REQUEST_URI} !-d
    RewriteRule ^/?(categoryxxx)((?:/(?:[^/]+))+)/?$ /$2/$1 [END,QSA]