【问题标题】:Nginx rewriteurl from example.com/script.php?param=value to example.com/valueNginx rewriteurl 从 example.com/script.php?param=value 到 example.com/value
【发布时间】:2018-08-05 05:34:43
【问题描述】:

我有一个接受单个参数的 PHP 脚本。

我的项目结构如下:

index.php
i.php
terms.php
functions
includes
icons
resources

我要重写其 URL 的脚本是 i.php from

example.com/i.php?icon=id

example.com/id

同时确保其他所有内容都可以正常访问(例如example.com/terms.php)。

我该怎么做?

编辑 这可能会有所帮助。这是我以前在 apache 服务器上使用的 .htaccess:

Options +FollowSymLinks  
RewriteEngine On  

RewriteCond %{SCRIPT_FILENAME} !-d  
RewriteCond %{SCRIPT_FILENAME} !-f  
RewriteRule ^(\w+)$ ./i.php?icon=$1

【问题讨论】:

  • 有什么问题,重写^/i.php?icon=(.*) /id break;
  • 这很简洁,但不一般。例如,如果用户编写了一个名为f.php 的新脚本并做了类似的事情怎么办?另外,如果查询字符串中没有icon 怎么办?另外,在您的建议中,您忘记使用反向引用 rewrite ^/i.php?icon=(.*) /$1

标签: php nginx url-rewriting


【解决方案1】:

你正在寻找类似的东西,

if ($query_string ~ .*=(.*)){ 
    return 301 $scheme://site.com/$1;
} 

但这并不是那么简单。这会将带有查询字符串和等号(不仅仅是i.php)的any URL 重定向到site.com/everything_after_the_equal_sign。如果您只想将此应用于i.php,则需要为其创建一个位置块,例如。

location /i.php/ {
    if ($query_string ~ .*=(.*)){ 
    return 301 $scheme://site.com/$1;
}

如果您有这样的现有位置块,则需要添加此 if 语句。如果您从通用位置块提供所有 PHP 内容,例如

location ~ \.php$ {
    #your config here
}

然后您需要专门添加/i.php/ 上方通用块。

最重要的是

如果是邪恶的(见here)。如果您在 location 块中有 if 语句,这将适用于您。如果可以,请尝试重写代码以在内部执行这些重定向。否则,如文档中所述,if 有时是不可避免的。

我希望这会有所帮助。

【讨论】:

【解决方案2】:

我已经通过使用它来工作了:

location / {
    try_files $uri $uri/ /i.php?icon=$uri;
}

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 2015-05-21
    • 1970-01-01
    • 2016-04-05
    • 2012-05-13
    • 2014-09-21
    • 2020-06-20
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多