Переписывание URL-адреса в строку запроса на Apache и Nginx

Я пытаюсь настроить некоторые перезаписи на двух отдельных серверах, используя mod-rewrite на Apache и один с помощью HttpRewriteModule на Nginx. Я не думаю, что я пытаюсь сделать что-то слишком сложное, но мои навыки регулярного выражения немного не хватает, и я действительно мог бы использовать некоторую помощь.

В частности, я пытаюсь преобразовать форматированный URL-адрес в строку запроса, чтобы ссылка отформатировалась следующим образом:

http://www.server.com/location/

указывает на это:

http://www.server.com/subdirectory/index.php?content=location

Все, что добавлено в конце отформатированного URL, должно быть добавлено к параметру "content" в строке запроса, так что это:

http://www.server.com/location/x/y/z

должен указывать на это:

http://www.server.com/subdirectory/index.php?content=location/x/y/z

Я уверен, что это должно быть возможно с использованием как Apache mod-rewrite, так и Nginx HttpRewriteModule на основе исследований, которые я сделал, но я не вижу, чтобы это работало. Если бы кто-нибудь мог дать мне несколько указаний о том, как собрать выражения для одной или обеих этих установок, я бы очень признателен. Спасибо!

Ответ 1

В nginx вы соответствуете "/location" в директиве rewrite, фиксируете хвостовую строку в переменной $1 и добавляете ее к заменяющей строке.

server {
...
rewrite ^/location(.*)$ /subdirectory/index.php?content=location$1 break;
...
}

В Apache httpd.conf это выглядит очень похоже:

RewriteEngine On
RewriteRule ^/location(.*)$ /subdirectory/index.php?content=location$1 [L]

Взгляните на примеры в конце этой страницы: https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html

Ответ 2

Строка поиска: (.+)/location/(.*)$

строка замены: $1/subdirectory/index.php?content=location/$2

Ответ 3

Для Apache в файле htaccess в корне вашего документа добавьте:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/subdirectory/index\.php$
RewriteRule ^(.*)$ /subdirectory/index.php?content=$1 [L]

В nginx вы хотите сначала убедиться, что запросы для /subdirectory/index.php пройдены, а затем переписать все остальное:

location ~ /subdirectory/index\.php$ 
{ 
} 

location / 
{ 
    rewrite ^(.*)$ /subdirectory/index.php?content=$1 break; 
}

Ответ 4

Это, вероятно, лучший способ сделать это в nginx:

location ^~ /location/ {
    rewrite ^/(location/.*)$ /subdirectory/index.php?content=$1 last;
}

Подробнее см.