2016-09-30 3 views
1

사이트를 apache에서 nginx로 이동하고 다음 구성으로 고정되어 있습니다.nginx 언어 하위 디렉토리 구성

메인 (영어) 버전을 표시하는 http://example.com/ 사이트가 있습니다. 또한 필자는 대응하는 하위 디렉터리를 사용하여 열 수있는 몇 가지 언어를 추가로 보유하고 있습니다. http://example.com/dehttp://example.com/fr, http://example.com/es 또는 http://example.com/es/ (뒤에 슬래시가 있음).

이러한 하위 디렉터리는 가상 (존재하지 않음)이지만 루트 디렉터리에서 동일한 페이지를 열어야합니다. PHP 스크립트가 언어 표현을 처리합니다.

이제 영어 사이트는 정상적으로 작동하지만 다른 언어는 작동하지 않습니다. http://example.com/es/ (후행 문자 만 사용 가능)을 열고 기본 페이지를 열 수 있지만 다른 모든 페이지에 액세스 할 수 없습니다 (예 : http://example.com/es/test.html은 서한 친구 URL 임). 이미 비슷한 질문과 답변을 많이 검토했지만 유용하지는 않습니다. 다음과 같이

server { 
    .... 
    root /var/www; 
    index index.php index.html index.htm; 

    location/{ 
      rewrite ^/(de|fr|it|es)\/(.*)$ /$2; 
      try_files $uri $uri/ @fallback; 
    } 

    location @fallback { 
      rewrite ^(.*)$ /seo.php?$args last; 
    } 

    location ~* \.(jpeg|ico|jpg|gif|png|css|js|pdf|txt|tar|gz|wof|csv|zip|xml|yml) { 
      access_log off; 
      try_files $uri @static; 
      expires 14d; 
      add_header Access-Control-Allow-Origin *; 
      add_header Cache-Control public; 
      root /var/www; 
    } 

    location @static { 
      rewrite ^/(\w+)/(.*)$ /$2 break; 
      access_log off; 
      rewrite_log off; 
      expires 14d; 
      add_header Cache-Control public; 
      add_header Access-Control-Allow-Origin *; 
      root /var/www; 
    } 

    location /backend/ { 

      rewrite ^(.*)$ /backend/index.php last; 
    } 

    location ~ \.php$ { 
      try_files $uri =404; 
      fastcgi_split_path_info ^(.+\.php)(/.+)$; 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include fastcgi_params; 
    } 
} 

그것은 이전에 아파치에 근무 :

RewriteRule ^(de|fr|it|es)\/(.*)$ $2 
RewriteCond %{REQUEST_URI} !^/(backend|template)/ 
RewriteCond %{REQUEST_FILENAME} !\.(gif|jpeg|png|js|css|swf|php|ico)$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteRule ^(.*)$ seo.php [L] 

은 알려 주시기 바랍니다 여기 내 구성입니다. 감사.

답변

1

분명히 Apache는 다시 쓰기를 적용하기 전에 /es/es/으로 변환합니다. nginx은 디렉토리가 실제로 존재하지 않는 한 그렇게하지 않습니다.

그러나 정규식을 미세하게 조정하고 후행 슬래시를 선택적으로 만들면 쉽게 해결할 수 있습니다.

이 시도 :

rewrite ^/(?:de|fr|it|es)(?:/(.*))?$ /$1; 
(:? )

구조가 아닌 캡쳐 기이다.

편집 :

당신이 후행 슬래시는 "눈에 띄게"추가 할 싶은 경우에, 당신이 리디렉션을해야합니다. 예 :

+0

이제 example.com/de을 열려고하면 대신 영어 버전이 열리고 대시 슬래시가 추가되지 않습니다 (도달하려는 항목). 언어 하위 디렉토리에있는 다른 URL은 여전히 ​​작동하지 않습니다. 예 : example.com/de/test.html (친숙한 서재응). – Ssey

+0

리디렉션 옵션을 추가하여 후행 슬래시를 추가했습니다. 두 번째 문제에 관해서는 오류가 무엇이고'/ seo.php'가 실행됩니까? –

+0

도움 주셔서 감사합니다. 이제 디렉토리가 작동합니다. URL 다시 쓰기도 작동합니다. 문제는 다음과 같은 것으로 보입니다. PHP 스크립트에 액세스하려고 시도하면 다시 쓰지 않아야합니다. example.com/de/api.php 또한 seo.php로 경로가 지정된 것으로 보이고 404 오류가 표시됩니다. example.com/api.php에 액세스하려고하면 (언어 디렉토리없이) 작동합니다. – Ssey