10

我正在尝试在两台单独的服务器上设置一些路径重写,一台在 Apache 上使用 mod-rewrite,另一台在 Nginx 上使用 HttpRewriteModule。我不认为我正在尝试做任何太复杂的事情,但是我的正则表达式技能有点缺乏,我真的可以使用一些帮助。

具体来说,我正在尝试将格式化的 URL 转换为查询字符串,以便链接格式如下:

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

会指出这一点:

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

格式化 URL 末尾的任何额外内容都应附加到查询字符串中的“内容”参数中,因此:

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,但我看不到让它工作。如果有人能给我一些关于如何将这些设置中的一个或两个的表达式放在一起的指示,我将不胜感激。谢谢!

4

4 回答 4

5

在 nginx 中,您在重写指令中匹配“/location”,捕获变量 $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

于 2016-10-30T21:53:38.290 回答
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; 
}
于 2012-10-18T06:37:25.240 回答
3

搜索字符串:(.+)/location/(.*)$

替换字符串:$1/subdirectory/index.php?content=location/$2

于 2012-10-18T03:11:20.213 回答
2

这可能是在 nginx 中执行此操作的最佳方法:

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

有关更多详细信息,请参阅:

于 2016-11-06T06:35:17.767 回答