PHP Webアプリケーションを開発しています。ページ、投稿、カテゴリ、製品などがあります。
SEOフレンドリーURLを作成するための私の.htaccess
ファイルは次のとおりです。
Options -Indexes
RewriteEngine on
RewriteRule ^Page/(.*)/(.*)$ Page.php?Page_Id=$1&Page_Title=$2 [NC,L]
RewriteRule ^Product/(.*)/(.*)$ Product.php?Product_Id=$1&Product_Title=$2 [NC,L]
RewriteRule ^Category/(.*)/(.*)$ Category.php?Category_Id=$1&Category_Title=$2 [NC,L]
RewriteRule ^Single/(.*)/(.*)$ Single.php?Post_Id=$1&Post_Title=$2 [NC,L]
RewriteRule ^Blog/(.*)/(.*)$ Blog.php?Category_Id=$1&Category_Title=$2 [NC,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]
<FilesMatch "\.(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
Order Allow,Deny
Deny from all
</FilesMatch>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 year"
</IfModule>
Page.php?Page_Id=13
にアクセスすると機能します。また、Page/13/Page-Title
にアクセスしても機能します。サーバー上でアプリケーションをテストするとすべてがうまくいきますが、wamp localhostでは機能しません。
私はアクティブです
LoadModule rewrite_module modules/mod_rewrite.so
apache http.conf
で、これが私の仮想ホストです:
<VirtualHost *:8080>
ServerName localhost
DocumentRoot c:/wamp64/www
<Directory "c:/wamp64/www/">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require local
</Directory>
</VirtualHost>
<VirtualHost *:8080>
ServerName schoolarshop
DocumentRoot "c:/wamp64/www/schoolarshop"
<Directory "c:/wamp64/www/schoolarshop/">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride none
Require local
</Directory>
</VirtualHost>
ローカルホストのエラーの例は次のとおりです。
Notice: Undefined index: Page_Id in Page.php on line 8
ローカルホストではなくサーバーで動作するのはなぜですか?
私はたくさんグーグルで検索しましたが、何も見つかりません。
Options +Indexes +Includes +FollowSymLinks +MultiViews
サーバー構成でMultiViews
を明示的に有効にしているのはなぜですか?これが問題の原因である可能性があります。サーバー構成(上記)から+MultiViews
を削除するか、.htaccess
の上部でMultiViewsを無効にしてください:
Options -Indexes -MultiViews
MutliViewsはデフォルトのApacheインストールでは無効になっていますが、一部の(共有)ホストでは有効になっているようです。したがって、当然のことながら、.htaccess
で無効にすることをお勧めします。
(しかし、なぜIncludes
を有効にしているのですか?これは本当に必要なのですか?PHPを使用しているため、これはほとんどありません。)
ユーザーフレンドリーなURLを作成するためにファイル拡張子を効果的に削除したため、MultiViewsの効果は顕著です。
MultiViewsが有効な場合(mod_negotiationの一部)... Page/13/Page-Title
を要求すると、Apacheは、ベース名Page
に一致する現在の/ルートディレクトリで一致するファイルを見つけようとします。適切なMIMEタイプ。これが発生しますbefore mod_rewriteは、フレンドリーURLを書き換えることができます。そのため、MultiViewsは、URLパラメーターを渡さずにリクエストをPage.php
に書き換えるので(URLの残りの部分はPATH_INFOとして表示される可能性が高いため)、「Undefined index」PHP通知になります。
(ただし、PHPスクリプト内でこの$_GET
変数の存在も確認する必要がありますが、実行していないようです。)