web-dev-qa-db-ja.com

URLの書き換えがwamp localhostで機能しない

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

ローカルホストではなくサーバーで動作するのはなぜですか?

私はたくさんグーグルで検索しましたが、何も見つかりません。

2
Mohammadreza
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変数の存在も確認する必要がありますが、実行していないようです。)

2
MrWhite