0

URL で .php ファイル拡張子を強制的に削除するという小さな問題があります。

ユーザーが次の場合、.php ファイル拡張子を正常に削除できます。

#Remove PHP if original request is /foo/bar.php
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule ^(.*)\.php(\?.*)?$ $1$2 [R=301,L]

私の目標は、次の場合に拡張機能を削除することです。

# Remove PHP if original request is /foo.php/bar

現在、ユーザーは URL にアクセスしてhttp://www.site.com/contact.php/aboutと入力すると、私の概要ページが表示されるためです。私の目標は、.php を強制的に削除してレンダリングすることです: http://www.site.com/contact/about

上記のコードを取得して追加したいと思っていましたが、わかりません。

ティア

4

4 に答える 4

2

次の.htaccessは、要求されたパラメーターを提供します。「ページ」を取得できます

AddDefaultCharset utf-8
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* - [L]

DirectoryIndex index.php

RewriteRule ^([a-zA-Z0-9_-]{3,20})/([^/]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3 [L]

RewriteRule ^([a-zA-Z0-9_-]{3,20})/([^/]+)?$ index\.php?page=$1&s=$2 [L]

RewriteRule ^([a-zA-Z0-9_-]{3,20})/?$ index\.php?page=$1 [L]

RewriteRule ^([a-zA-Z0-9_-]{3,20})?$ index\.php?page=$1 [L]

ErrorDocument 404 /404

「ページ」パラメータを取得し、次のように呼び出します

include('inc/'.$_REQUEST['page'].'.php');

.phpリンクから extを削除することを忘れないでください

于 2012-09-11T14:43:17.507 に答える
1

削除部分があるように見えますが、内部で書き換える部分がありません。あなたが持っているものはURLから削除しようとし、phpそれなしでクライアントをURLにリダイレクトします。ただし、条件がリクエストと一致していない場合は、次のように変更してください。

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ .*\.php.*$
RewriteRule ^(.*)\.php(.*)?$ /$1$2 [R=301,L]

次に、内部で書き直す必要があります(ブラウザをリダイレクトしないでください)。したがって、同じhtaccessファイルに次を追加します。

RewriteCond %{REQUEST_URI} ^/([^/]+)(.*)$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^([^/]+)(.*)$ /$1.php$2 [L]
于 2012-09-11T14:58:56.857 に答える
0

2行をこの1行に置き換えます:(ルールにエラーがあるため、途中で.phpが検出されず、書き換え条件は必要ありません)

RewriteRule ^(.+)\.php(/.*)?$ /$1$2 [L,R=301]
于 2012-09-11T14:40:58.397 に答える
0

これらの問題に対する私の解決策は、基本的に複雑な書き換えルールの使用を避け、単純なフロント コントローラーを介して PHP 側から URL ルーティングを行うことです。

Web サイトのルートに次の .htaccess ファイルを記述します。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

次に、同じディレクトリに index.php ファイルを書き込みます。index.php ファイルでは、引き続き URL 情報全体を取得し、これに基づいて含める PHP ファイルを選択できます。

<?php
// urldecode and get rid of the query string, $_GET is still available
$url = urldecode(preg_replace('/\\?(.*)$/', '', $_SERVER['REQUEST_URI']));

if ($url == '/contact/about') {
    include 'contact.php';
}

この例は非常に基本的なものであり、おそらくあなたの Web サイトのアーキテクチャの微妙な点は無視していますが、長期的にはこのアプローチの方がはるかに実行可能です。なぜなら、mod_rewrite の複雑さに耐えることなく、好みの URL を PHP スクリプトに実際にマッピングできるからです。 .

これは、事実上すべての既存の PHP フレームワーク (少なくとも MVC フレームワーク) で採用されているパターンです。

このアプローチの最小限の例は、Slim マイクロ フレームワークにあります: http://www.slimframework.com/

于 2012-09-12T09:37:35.523 に答える