Мой сайт ранее находился на сервере 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
URL по стране:
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]
URL тега:
RewriteEngine On
RewriteBase /tag/
RewriteRule ^(.+)/$ index.php?tag=$1 [L]
RewriteRule ^(.+)/page/(.+)/$ index.php?tag=$1&page=$2 [L]
URL страницы:
RewriteEngine On
RewriteBase /title/
RewriteRule ^page/(.+)/$ index.php?page=$1 [L]
Я пробовал онлайн .htaccess
в конвертер Nginx, но он, похоже, не работает. Может ли кто-нибудь помочь мне преобразовать это .htaccess
в Nginx?
Думаю, основная проблема здесь не в преобразовании правил, а в понимании того, где их следует использовать. По каталогу .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]
rewrite
директива: rewrite regex replacement [flag];
Замены идентичны замены. Формат регулярного выражения (шаблона) такой же. Но:
/
к началу (также ^/
, /country/
и т.д.). /country/
и т.п.;
в конце каждой строки правила.В флаги есть эти эквиваленты:
[L]
-> last
внутри server {}
и break
внутри location {}
.
Эта часть на самом деле очень важна, так как большинство конвертеров не могут понять разницу в контексте!
Но если эти директивы поместить в
location
, тоlast
флаг следует заменить наbreak
, иначе nginx выполнит 10 циклов и вернет ошибку 500.
[R=302]
-> redirect
[R=301]
-> permanent
Перезапись Apache условия лайк RewriteCond %{HTTP_HOST} ^example.com
можно заменить в Nginx на 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
вместо того last
. Winginx's Конвертер htaccess в nginx работает лучше.)