Apache-2.2

mod_rewrite 問題 Apache 在 Nginx 後面

  • December 4, 2017

我有 nginx 代理到 apache 作為後端,以便 nginx 處理靜態資產。不幸的是,當我嘗試訪問“漂亮的 url”時,它只會顯示索引頁面。

nginx 配置

server {
       listen   80;

       root /var/www/example.com;
       index index.php index.html index.htm;

       server_name example.com www.example.com a.example.com b.example.com c.example.com;

       location / {
               try_files $uri $uri/ /index.php;
       }

       location ~ \.php$ {

               proxy_set_header X-Real-IP  $remote_addr;
               proxy_set_header X-Forwarded-For $remote_addr;
               proxy_set_header Host $host;
               proxy_pass http://127.0.0.1:8080;
       }

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

Apache 虛擬主機配置

<VirtualHost 127.0.0.1:8080>
       ServerName example.com
       ServerAlias www.example.com
       ServerAlias a.example.com
       ServerAlias b.example.com
       ServerAlias c.example.com

       ServerAdmin info@example.com
       DocumentRoot /var/www/example.com

       <Directory /var/www/example.com>
               AllowOverride All
       </Directory>

       ErrorLog ${APACHE_LOG_DIR}/5r_error.log
       CustomLog ${APACHE_LOG_DIR}/5r_access.log combined
</VirtualHost>

.htaccess

RewriteEngine on

RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
RewriteCond %{REQUEST_FILENAME} !/maintenance.html
RewriteRule ^.*$ /maintenance.html [L]
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%2://%1%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTP_HOST} ^example-old.co.uk [NC,OR]
RewriteCond %{HTTP_HOST} ^www.example-old.co.uk [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301,NC]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

RewriteRule ^servers/([^\/]+)/?$ servers.php?scroll-to-server=$1 [L,QSA]
RewriteRule ^media/([0-9]+)$ media.php?media-id=$1 [L,QSA]
RewriteRule ^media/([a-z,]+)$ media.php?filter=$1 [L,QSA]
RewriteRule ^manage/?([^\/]+)$ admin.php?page=$1 [L,QSA]
RewriteRule ^operations/?([^/]*)(.*)$ operations.php?c=$1&m=$2 [L,QSA]

ErrorDocument 404 /error
ErrorDocument 403 /error

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]

當我訪問example.com它時,它載入正常,當我訪問example.com/test它時,它仍然顯示首頁。頁面的 chrome 請求返回 200。

try_files將 URL 更改為/index.php以便將其發送到上游,這會失去漂亮的永久連結

您可以嘗試通過添加命名位置來向上游發送*漂亮的永久連結。*可能是:

location / {
   try_files $uri $uri/ @proxy;
}

location @proxy {
   proxy_set_header X-Real-IP  $remote_addr;
   proxy_set_header X-Forwarded-For $remote_addr;
   proxy_set_header Host $host;
   proxy_pass http://127.0.0.1:8080;
}
location ~ \.php$ {
   proxy_set_header X-Real-IP  $remote_addr;
   proxy_set_header X-Forwarded-For $remote_addr;
   proxy_set_header Host $host;
   proxy_pass http://127.0.0.1:8080;
}

有關詳細資訊,請參閱

引用自:https://serverfault.com/questions/755759