如何在Nginx中使用.htaccess文件?

55

我目前正在将我的网站从Apache迁移到nginx,但是我的.htaccess文件无法工作。我的网站位于/usr/share/nginx/html/mywebsite文件夹中。如何在我的nginx服务器上使用.htaccess?

这是我的.htaccess文件:

RewriteEngine on
RewriteRule video/watch/([a-zA-Z0-9_@$*-]+)/?$ "videos-single.php?id=$1" [NC]
5个回答

62

Nginx 不支持 .htaccess(参见这里"你不能这样做。如果你需要 .htaccess,你可能是在做错事情。")。

你有两个选择(据我所知):


我认为 /etc/nginx/nginx.conf - 可以查看 nginx 包的文件列表。 - uzsolt
4
如果您正在使用共享服务器,那么您无法访问 /etc/nginx,那么是否有类似于 .htaccess 的配置文件用于子域所在的文件夹? - NaturalBornCamper
1
@NaturalBornCamper 那我猜你将不得不使用Apache。 - Uri
1
@NaturalBornCamper 我认为你会有自己的配置文件来管理你的网站,你可以联系你的托管提供商,或者如果你自己管理,你可以指定你的网站域名的配置。 - moghwan

23

声明:本人是htaccess for nginx的作者,该插件现在已经成为开源软件。

在过去的几年中,我创建了一个插件,将htaccess行为实现到nginx中,特别是像RewriteRuleAllowDeny这样的内容,可以对Web安全至关重要。该插件在我的生产环境中使用,没有出现任何问题。

我完全赞同nginx的效率和速度的观点,以及他们为什么不实现htaccess。 然而,请想一想。如果您在使用nginx时加上htaccess,情况不会变得更糟。您仍然保持nginx的高性能,同时可以轻松地在一个Web服务器上驱动您的旧设备。


1
软件整合太难了。您应该编写一个完整的教程。 - Tony
3
我决定将我的代码作为开源项目发布:https://github.com/e404/htaccess-for-nginx 非常欢迎Pull requests(拉取请求)。 - Gerald
@Sebi2020 不需要许可证。你使用的是这里的当前版本吗?https://github.com/e404/htaccess-for-nginx - Gerald
2
离题了,但这是一个小恶习。它是“披露”,而不是“免责声明”。您正在披露您是作者。 - liamvictor
2
@liamvictor 请查看这些关于EL&UELL的问题。 - iBug
显示剩余7条评论

10

官方不支持在nginx中使用此功能。如果需要此类功能,则需要使用Apache或其他支持此功能的http服务器。

也就是说,官方nginx解释 是有缺陷的,因为它混淆了用户想要做什么和实现方式。例如,nginx可以轻松地每10秒/分钟检查一次目录,或者可以使用inotify等机制。这将避免在每个请求上都进行检查...但是知道这些并不能帮助你。 :)

您可以通过编写脚本来绕过此限制,该脚本将等待nginx配置文件出现,然后将其复制到/etc/nginx/conf.d/。但是可能会存在某些安全问题-由于nginx中没有原生支持.htaccess,因此也不支持限制配置文件中允许的配置指令。结果可能因人而异。


2
我并不反对扫描文件是浪费资源的推理,但它绝对不需要那么极端。可以只查看由最终用户定义的额外配置文件的根目录。它需要成为自己的新配置块(DirectoryOverride?),并通过查看文件修改时间重新加载nginx配置到内存中。1)它甚至不需要在每个请求上执行;2)它将允许预验证和缓存最终用户配置;3)它仍将允许最终用户使用位置块来保护目录并添加重写。 - davidwebca

1
使用配置文件是一种选择,但 .htaccess 文件的好处在于提供了一种方式,使得 Web 开发人员可以在没有对服务器 root 访问权限的情况下控制服务器设置。遗憾的是,在 nginx 上似乎没有类似的东西。
我知道在 Apache 上设置会降低响应时间,但希望有一种在 nginx 上进行相同操作而不会影响性能的方法… 至少有一种方式来使用正则表达式对 URL 进行重写。

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

-1
"有没有 Nginx 的方式可以使用正则表达式进行批量重定向而不会减慢响应时间。"

只需使用myphpmyadmin编辑您的数据库。

  1. 打开myphpmyadmin,选择您的数据库,然后找到"yourprefix_Posts"表。
  2. 打开它,然后单击"搜索"选项卡,再点击"查找和替换"。
  3. 在下拉菜单中选择"post_content"。
  4. 在"查找"字段中,输入要更改的URL:"website.com/oldURL"。
  5. 在"替换"字段中,输入新的URL:"website.com/newURL"。 (要使用正则表达式,请勾选"正则表达式"框。)

注意:您可以通过简单地将"替换"字段留空来测试此操作。

在进行更改之前,务必备份数据库。这可能听起来很可怕,但实际上并不是。它非常简单,并且可以用于快速替换几乎任何内容。


这不是重定向,而是URL的更改。 - Juburin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接