在 nginx 服务器上托管 Stacey?(将 .htaccess 转换为 nginx)

在 nginx 服务器上托管 Stacey?(将 .htaccess 转换为 nginx)

史黛西是一个轻量级内容管理系统。我在我的作品集网站上使用它,但它使用 .htaccess 文件来创建友好的 URL。是否可以重写此 .htaccess 行以在 nginx 中使用?以下是 .htaccess 文件内容;

RewriteEngine on

# Some hosts require a rewritebase rule, if so, uncomment the RewriteBase line below. If      you are running from a subdirectory, your rewritebase should match the name of the path to    where stacey is stored.
# ie. if in a folder named 'stacey', RewriteBase /stacey
#RewriteBase /

ErrorDocument 404 /404.html

# Rewrite any calls to *.html, *.json, *.xml, *.atom, *.rss, *.rdf or *.txt if a folder      matching * exists
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !public/
RewriteCond %{DOCUMENT_ROOT}/public/$1.$2 !-f
RewriteRule (.+)\.(html|json|xml|atom|rss|rdf|txt)$ $1/ [L]

# Add a trailing slash to directories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.|\?)
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ([^/]+)$ $1/ [L]

# Rewrite any calls to /render to the image parser
RewriteCond %{REQUEST_URI} render/
RewriteRule ^render/. app/parsers/slir/ [L]

# Rewrite any calls to /* or /app to the index.php file
RewriteCond %{REQUEST_URI} /app/$
RewriteRule ^app/ index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ index.php?/$1/ [L,QSA]

# Rewrite any file calls to the public directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !public/
RewriteRule ^(.+)$ public/$1 [L]`

提前致谢!


我取得了一些进展。如下:

location / {
if ($uri ~ "/app/$"){
rewrite ^/app/ /index.php last;
}

if (!-e $request_filename){
rewrite ^/(.*)/$ /index.php?$1 last;
}

if (!-f $request_filename) {
rewrite ^/(?!public/)(.+);
}

if (!-f $request_filename) {
rewrite ^/(?!public/)(.+)\.(html|json|xml|atom|rss|rdf|txt)$ $1/ last;
}

if (!-e $request_filename) {
rewrite ^/(?!public/)(.+)$ public/$1 last;
}

现在重写所有项目没有任何问题。例如;

domain.com/?/projects/project-name-3/ 变成了 domain.com/projects/project-name-3/

但还有另外 2 个页面。其中一个是“关于”,另一个是“联系我”。它们也变成了;domain.com/about 和 domain.com/contact-me,但当我单击它们时,页面会加载,但没有 CSS 样式。有什么线索吗?


好的,新代码是这样的,它给了我错误;nginx:[emerg] /etc/nginx/sites-enabled/domain.com:21 中的“rewrite”指令中的参数数量无效

location / {
rewrite ^/app/ /index.php last;
}
if (!-e $request_filename){
rewrite ^/(.*)/$ /index.php?$1 last;
}

if (!-f $request_filename) {
rewrite ^/(?!public/)(.+);
}

if (!-f $request_filename) {
    rewrite ^/(?!public/)(.+)\.(html|json|xml|atom|rss|rdf|txt)$ $2/ last;
}

try_files /public$uri /public$uri/ $uri $uri/ /index.php;
}

21.行的代码是;

rewrite ^/(?!public/)(.+);

答案1

我最近使用以下配置将一些 Stacey 网站迁移到 Nginx:

server {

        root SERVER FILE LOCATION;
        index index.php index.html index.htm;

        # Make site accessible from
        server_name YOUR IP OR DOMAIN NAME;

        location / {
        # Stacey Rules
        error_page 404 /404.html;

        # Rewrite any calls to /render to the image parser
        rewrite ^/render/. /app/parsers/slir/ break;

        # Rewrite any file calls to the public directory
        try_files $uri $uri/ /index.php?$uri;
        }

        # Block access to .htaccess files
        location ~ /\.ht {
        deny  all;
        }

        include /usr/local/nginx/conf/staticfiles.conf;
        include /usr/local/nginx/conf/php.conf;
}

注意:包含文件只是标准错误页面链接和 PHP(Fast-cgi php-fpm)配置,我将它们放在一起以避免在多个站点设置中重复相同的操作。

通过https://github.com/kolber/stacey/issues/143

答案2

你已经基本到达目的地了。

五个中的三个rewrite可以用 nginx 的更快、更简单的方式替换try_files指令。一个可以简化一点。第五个有逻辑错误,如您的问题中所述。

  1. 首先,您不需要将此检查放在其中,if因为它包含其自己的模式匹配。

    location / {
        rewrite ^/app/ /index.php last;
    

    这也可以放在它自己的location块中,但留待以后再说……

  2. 第二,你的逻辑错误。当你重写这条规则时,你将两个()模式匹配改为三个,但没有调整反向引用$1$2解释其在新正则表达式中的位置变化。

        if (!-f $request_filename) {
            rewrite ^/(?!public/)(.+)\.(html|json|xml|atom|rss|rdf|txt)$ $2/ last;
        }
    
  3. 最后,try_files。对于非常简单的匹配,这比 快得多rewrite,也更容易理解。所以...

        try_files /public$uri /public$uri/ $uri $uri/ /index.php;
    }
    

这应该能让你完成 99% 的任务,除非你根据问题中没有的信息进行最后的调整。

答案3

我正在使用 stacey cms,下面是我用来代替 apache 的 nginx 配置:

server {

    listen 80;
    server_name localhost;
    root /home/vagrant/test;
    index index.php index.html index.htm;
    error_page 404 /404.html;

    location / {
      if ($query_string != "") {
        return 301 $scheme://$http_host$query_string;
      }
      try_files $uri $uri/ /index.php?$uri;
    }

    location ~ \.php$ {
        try_files $uri =403;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

if ifblock 绝对不是 nginx 配置的理想或惯用方法。但对于与 stacey 合作来说,这是必需的。

相关内容