![将每个目录的 .htaccess (Apache) 转换为 Nginx](https://linux22.com/image/703182/%E5%B0%86%E6%AF%8F%E4%B8%AA%E7%9B%AE%E5%BD%95%E7%9A%84%20.htaccess%20(Apache)%20%E8%BD%AC%E6%8D%A2%E4%B8%BA%20Nginx.png)
我的网站之前在 Apache 服务器上。这是一个自定义 PHP 网站,.htaccess
几乎每个文件夹都有。我已设法让.htaccess
主目录中的部分在 Nginx 上运行,但我无法使用每个目录.htaccess
指令执行相同操作。
以下是一些.htaccess
文件:
主要的.htaccess
:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteRule ^search(.+)/$ search.php?search=$1 [L]
RewriteRule ^search(.+)/page/(.+)/$ search.php?search=$1&page=$2 [L]
RewriteRule ^nonton/(.+)/$ download.php?download=$1 [L]
RewriteRule ^nonton/(.+)/(.+)/$ download.php?download=$1&size=$2 [L]
RewriteRule ^get/(.+)/$ get_dl.php?dl=$1 [L]
RewriteRule ^(.+)-live-streaming/$ tv.php?tv=$1 [L]
RewriteRule ^thumb/(.+)$ data/thumb.php?i=$1 [L]
RewriteRule ^sitemap.xml$ sitemap.php [L]
Options -Indexes
按国家/地区列出的网址:
RewriteEngine On
RewriteBase /country/
RewriteRule ^(.+)/$ index.php?country=$1 [L]
RewriteRule ^(.+)/page/(.+)/$ index.php?country=$1&page=$2 [L]
按类型分类的 URL:
RewriteEngine On
RewriteBase /genre/
RewriteRule ^(.+)/$ index.php?genre=$1 [L]
RewriteRule ^(.+)/page/(.+)/$ index.php?genre=$1&page=$2 [L]
标签网址:
RewriteEngine On
RewriteBase /tag/
RewriteRule ^(.+)/$ index.php?tag=$1 [L]
RewriteRule ^(.+)/page/(.+)/$ index.php?tag=$1&page=$2 [L]
页面网址:
RewriteEngine On
RewriteBase /title/
RewriteRule ^page/(.+)/$ index.php?page=$1 [L]
我尝试过在线.htaccess
Nginx 转换器,但似乎失败了。有人能帮我将其转换.htaccess
为 Nginx 吗?
答案1
我想这里的主要问题不是转换规则,而是了解应该在哪里使用它们。每个目录.htaccess
语境是 Apache HTTPD 特定功能,而 Nginx 不支持这种行为。
Nginx 的对应内容是location
指令nginx.conf
,例如
http {
. . .
server {
. . .
location /country/ {
rewrite ^/country/(.+)/$ /country/index.php?country=$1 break;
rewrite ^/country/(.+)/page/(.+)/$ /country/index.php?country=$1&page=$2 break;
}
location /genre/ {
rewrite ^/genre/(.+)/$ /genre/index.php?genre=$1 break;
rewrite ^/genre/(.+)/page/(.+)/$ /genre/index.php?genre=$1&page=$2 break;
}
}
}
在这里,你可以使用rewrite
任何转换工具你已经找到了,但你也可以自己学习如何转换它们,因为语法是极其相似的:
- 阿帕奇的
RewriteRule
指示:RewriteRule Pattern Substitution [flags]
- Nginx 的
rewrite
指示:rewrite regex replacement [flag];
替换与替代。正则表达式(模式)格式相同。但是:
- 在 Nginx 中,您必须
/
在开头包含前导 (也包括^/
,/country/
等等)。 - 替换也是与根相关的,因此您必须包含前导
/country/
等。 - 您需要
;
在每条规则行的末尾。
这旗帜有这些等价物:
[L]
->last
内部server {}
和break
内部location {}
。这部分实际上至关重要,因为大多数转换器无法理解上下文的差异!
但是如果这些指令放在里面
location
,则last
标志应该替换为break
,否则 nginx 将进行 10 次循环并返回 500 错误。[R=302]
->redirect
[R=301]
->permanent
Apache 的重写状况在 Nginx 中可以使用以下方法RewriteCond %{HTTP_HOST} ^example.com
替换if
指令: if ($http_host ~ "^example.com") { }
,例如
location / {
if ($http_host ~ "^example.com"){
rewrite ^(.*)$ http://www.example.com/$1 redirect;
}
rewrite ^/(.+)-live-streaming/$ /tv.php?tv=$1 break;
}
其余内容,您可以通过阅读链接的手册和使用转换工具来学习。(我之前链接到Apache2nginx 的转换工具无法处理根相对论并使用break
。Winginxlast
的htaccess 到 nginx 转换器效果更好。