私が取り組んできたZendFrameworkベースのサイトは、現在、本番サーバーに移行されています。このサーバーはnginxであることが判明しました(驚きです!)。当然、このサイトはApacheで開発されており、htaccessファイルに依存しているため、正しく機能しません。
私の質問は...誰かがこれについて何か経験がありますか? htaccessファイルが行うことをnginx.confファイルに変換する方法に関するアイデアはありますか?私はこれを研究していますが、誰かがすでにこれを経験していることを望んでいます。ありがとう!
編集:これは現在のhtaccessです:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]
私はそれがかなり古いスレッドであることを知っていますが、とにかく何人かの人々を助けるかもしれません。
基本的には404エラーをindex.phpにリダイレクトしますが、ファイルが存在する場合(ファイルを入力)、正しいルートが設定されます。
頭のてっぺんからやりました。すぐには機能しない可能性があり、正しいパスとfastcgi構成を設定する必要があります。また、Zend_Frameworkでそのように機能するはずなので、すべてをindex.phpに戻します。
error_page 404 = /index.php;
location / {
if (-f $request_filename) {
root /var/www;
}
}
location ~ \.php$ {
fastcgi_pass unix:/tmp/php.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/index.php;
include /etc/nginx/fastcgi_params;
}
server {
listen 80; ## listen for ipv4
listen [::]:80 default ipv6only=on; ## listen for ipv6
server_name localhost;
access_log /var/log/nginx/localhost.access.log;
error_log /var/log/nginx/localhost.error.log;
root /var/www/localhost/public;
try_files $uri @php_index;
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location @php_index {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/localhost/index.php;
include fastcgi_params;
}
}
可能な限りtry_filesを使用することをお勧めします。
Htaccessファイルを自動/体系的に変換する方法はわかりません。おそらく手動で変換する必要があります。 Nginx wiki はnginxドキュメントに最適なリソースです。
編集:私は今NginxでZend Frameworkを実行していますが、構成は次のようになります。
server {
listen 80;
server_name servername.com;
root /var/www/zendapp/public;
location / {
index index.php;
}
# Deny access to sensitive files.
location ~ (\.inc\.php|\.tpl|\.sql|\.tpl\.php|\.db)$ {
deny all;
}
location ~ \.htaccess {
deny all;
}
# Rewrite rule adapted from zendapp/public/.htaccess
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
# PHP scripts will be forwarded to fastcgi processess.
# Remember that the `fastcgi_pass` directive must specify the same
# port on which `spawn-fcgi` runs.
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
location = /50x.html {
root /var/www/default;
}
}
ご覧のとおり、書き換えルール自体は非常に単純です。
これは「公式」で、シンプルでうまく機能します。
役立つ可能性のあるステージングサーバーの場合;)
fastcgi_param APPLICATION_ENV staging;
実際、私はzendフレームワークのように機能するdrupalサイトでnginxを実行します:ブートストラップとして1つのindex.php
これがルールです(zendフレームワークではテストされておらず、drupalでのみテストされていますが、類似している必要があります)
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
break;
}
}
error_page 404 /index.php;
http://some.url/myproject/controller/ のようなプロジェクトのサブディレクトリを使用する場合は、setBaseUrlをbootstrapファイルに追加する必要もあります。
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initSomeFancyName()
{
$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
$frontController->setBaseUrl('/myproject'); // set the base url!
}
}
Nginxの書き換えは次のようになります。
location /myproject/ {
if (!-e $request_filename) {
rewrite ^/myproject/(.*)$ /index.php?$1? last;
}
}
PS疑問符はタイプミスではありません!
可能であれば、Nginxボックスからのみアクセス可能な非標準ポートにApacheをセットアップし、ApacheへのNginxプロキシを用意することをお勧めします。