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