Luracast Restlerと Restler のAPI Explorer ( Swagger UIのフォーク)の書き換えの問題に取り組んでいます。OSX マシンの localhost で完全に動作する開発環境を使用していますが、同じファイル (.htaccess ファイルを含む) が、Ubuntu を実行している製品前のボックスでは動作しません。どちらの場合も httpd.conf ファイルにアクセスでき、何らかの回答を求めてそれらに注ぎ込みました。確かに、mod-rewrite はまだ私にとってある種の闇の魔法なので、他の人からアドバイスをもらいたいと思っています。
httpd.conf に次のエントリを追加して、両方の環境でログを有効にしました。
RewriteLog logs/rewrite.log
RewriteLogLevel 2
これにより、プリプロダクションでいくつかの興味深い結果が得られます。を呼び出すとhttp://website.com/api/explorer
、次のようになります。
[perdir /var/www/html/api/] rewrite 'resources.json' -> 'index.php'
[perdir /var/www/html/api/] trying to replace prefix /var/www/html/api/ with /
[perdir /var/www/html/api/] internal redirect with /index.php [INTERNAL REDIRECT]
[perdir /var/www/html/] pass through /var/www/html/index.php
[perdir /var/www/html/api/explorer/] rewrite '' -> 'index.html'
[perdir /var/www/html/api/explorer/] trying to replace prefix /var/www/html/api/explorer/ with /
[perdir /var/www/html/api/explorer/] internal redirect with /index.html [INTERNAL REDIRECT]
[perdir /var/www/html/] rewrite 'index.html' -> '/index.php'
[perdir /var/www/html/] trying to replace prefix /var/www/html/ with /
[perdir /var/www/html/] internal redirect with /index.php [INTERNAL REDIRECT]
[perdir /var/www/html/] pass through /var/www/html/index.php
[perdir /var/www/html/] rewrite 'wp-content/themes/pagelines/pagelines-compiled-css-1_1356593315/' -> '/index.php'
[perdir /var/www/html/] trying to replace prefix /var/www/html/ with /
[perdir /var/www/html/] internal 1168/initial/redir#1] (1) [perdir /var/www/html/] pass through /var/www/html/index.php
興味深いことに、私には説明がつきませんが、ローカル環境で同じ URL を呼び出してもまったくログが記録されないことです (0 バイトのログがあるため、httpd.conf で正しく構成したと思います)。ローカル環境 (Restler WORKS) には/api/explorer
、/api/explorer/index.html
.
の .htaccess ファイルは/api/explorer
次のようになります。
DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ index.html [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.html [QSA,L]
</IfModule>
その中/api
には:
DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ index.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
アップデート
@faa の提案に基づいて、.htaccess ファイルにベース パスを追加しました。
RewriteBase /var/www/html/api/explorer/
また[QSA,L]
、ルールのパラメーターを に変更しました[QSA,L,DPI]
。ログには次のように記載されています。
(2) [perdir /var/www/html/api/explorer/] rewrite '' -> 'index.html'
(2) [perdir /var/www/html/api/explorer/] trying to replace prefix /var/www/html/api/explorer/ with /var/www/html/api/explorer/
(1) [perdir /var/www/html/api/explorer/] internal redirect with /var/www/html/api/explorer/index.html [INTERNAL REDIRECT]
(2) [perdir /var/www/html/] rewrite 'var/www/html/api/explorer/index.html' -> '/index.php'
(2) [perdir /var/www/html/] trying to replace prefix /var/www/html/ with /
(1) [perdir /var/www/html/] internal redirect with /index.php [INTERNAL REDIRECT]
(1) [perdir /var/www/html/] pass through /var/www/html/index.php
私が困惑するのは、これを正しく読んでいる場合、次のことです。
- 「」から「index.html」に正しくリダイレクトします
- しかし、2行目の「接頭辞を置き換えようとする」は完全に冗長なようです
- そしてなぜ!#?! 「/var/www/html/api/explorer/index.html」で内部リダイレクトを行いますか?
私がこれを行うと、次のls -l /var/www/html/api/explorer/index.html
ようになります。
-rw-rw-r-- 1 ec2-user apache 3292 Jan 23 09:00 /var/www/html/api/explorer/index.html
明らかにこのファイルが存在し、apache がこのコンテンツを提供するためのパーミッションは問題ありません。
更新 2
次のような.htaccessファイルを持つルートにWordpressをインストールしたことも注目に値します(ところで、これはデフォルトのWPと一般的なW3 Total Cacheプラグインです):
# BEGIN W3TC Browser Cache
<IfModule mod_deflate.c>
<IfModule mod_setenvif.c>
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
</IfModule>
<IfModule mod_headers.c>
Header append Vary User-Agent env=!dont-vary
</IfModule>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE text/css application/x-javascript text/x-component text/html text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon
</IfModule>
</IfModule>
<FilesMatch "\.(css|js|htc|CSS|JS|HTC)$">
<IfModule mod_headers.c>
Header set Pragma "public"
Header set Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate"
</IfModule>
FileETag MTime Size
<IfModule mod_headers.c>
Header set X-Powered-By "W3 Total Cache/0.9.2.4"
</IfModule>
</FilesMatch>
<FilesMatch "\.(html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|HTML|HTM|RTF|RTX|SVG|SVGZ|TXT|XSD|XSL|XML)$">
<IfModule mod_headers.c>
Header set Pragma "public"
Header set Cache-Control "max-age=3600, public, must-revalidate, proxy-revalidate"
</IfModule>
FileETag MTime Size
<IfModule mod_headers.c>
Header set X-Powered-By "W3 Total Cache/0.9.2.4"
</IfModule>
</FilesMatch>
<FilesMatch "\.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|otf|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip|ASF|ASX|WAX|WMV|WMX|AVI|BMP|CLASS|DIVX|DOC|DOCX|EOT|EXE|GIF|GZ|GZIP|ICO|JPG|JPEG|JPE|MDB|MID|MIDI|MOV|QT|MP3|M4A|MP4|M4V|MPEG|MPG|MPE|MPP|OTF|ODB|ODC|ODF|ODG|ODP|ODS|ODT|OGG|PDF|PNG|POT|PPS|PPT|PPTX|RA|RAM|SVG|SVGZ|SWF|TAR|TIF|TIFF|TTF|TTC|WAV|WMA|WRI|XLA|XLS|XLSX|XLT|XLW|ZIP)$">
<IfModule mod_headers.c>
Header set Pragma "public"
Header set Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate"
</IfModule>
FileETag MTime Size
<IfModule mod_headers.c>
Header set X-Powered-By "W3 Total Cache/0.9.2.4"
</IfModule>
</FilesMatch>
# END W3TC Browser Cache
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress