0

私はインターネットショップを持っていて、リンクを短くするためにhtaccessを使用したいのですが、URLには3つのケースがあります。

shop.com/shop/18 (number) - products.php?categoryid=$1
shop.com/shop/18/page-2 (number)/(page+number) - products.php?categoryid=$1&page=$2
shop.com/shop/18/9877 (number)/(number) - description?categoryid=$1&productid=$2

私の試み

RewriteRule ^shop/?$                        shop.php
RewriteRule ^shop/(.*)/([0-9]+)/?$          description.php?categoryid=$1&productid=$2
RewriteRule ^shop/(.*)/page-(.*)/?$         products.php?categoryid=$1&page=$2
RewriteRule ^shop/(.*)/?$                   products.php?categoryid=$1

私の試してみて-1(動作する)、2(動作する)、3(動作しない)

  1. どうすればURLを書き換えることができますか?

  2. たとえば、そのような数のカテゴリまたはそのような製品がない場合、どうすれば404ページにリダイレクトできますか(phpとmysqlで確認してからリダイレクトすると推測します)?

4

2 に答える 2

2

これに対処する方法はいくつかあります。

  • すべてhtaccessで(複数の深さで乱雑になります)
  • htaccessとサーバーサイドコードの組み合わせ

最善のアプローチは、ストアのコーディング方法に基づいて自分に合ったアプローチです。個人的には、サーバー側のコードで処理する方が優れていると感じています。htaccessファイルが簡素化され、データの検証、送信内容、送信先、およびデータがそこに到達したときの処理方法をより細かく制御できるようになります。 。

たとえば、私のhtaccessファイルには次のものがあります。

<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine on
#
# Do not apply rewrite rules for non required areas 
RewriteCond %{REQUEST_URI} "/hidden-areas/" [OR]
RewriteCond %{REQUEST_URI} "/other-areas/"
RewriteRule (.*) $1 [L]

# Do Not apply if a specific file or folder exists
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# The rules on how to rewrite the urls  
RewriteRule (.*) /index.php?url=$1 [QSA,L]
</IfModule>

基本的に、これを簡単に説明するために、特定のフォルダーについては何も書き直さず、そのまま転送します。これは、外部からのスクリプトの呼び出しを停止するため、または追加された追加のシステムに問題なくアクセスできるようにするためです。

次に、URL全体を文字列としてインデックスページに転送し、PHPを使用して何が発生するかを処理します。例を以下に示します。

// collect the passed url
$url = $_GET['url'];
// split the url into parts
$url_parts = explode('/', $url);
/*
* start sorting what is what in the url
*/
// count how many parts there are
$url_parts_count = count($url_parts);
// determine the class/module
$class = $url_parts[0]; // generally the class/method/module depending on your system, thgough could be a category so run some checks
// determine the last part in the array
$last_url_part = ($url_parts_count - 1);
// set the last part of the url to be used
$slug = $url_parts[$last_url_part]; // generally the slug and will be empty if theres a trailing slash
etc etc etc

これは単なる要約であり、私が書いたCMSから取得したものであるため、はるかに多くのことを行いますが、手を汚したい場合は、非常に良い出発点になるはずです。もちろん、必要に応じてさらに詳しく説明させていただきます。

もちろん、既成のシステムを使用している場合は、このコードがすでに提供されているはずです;)

私はあなたの更新された質問に基づいて何かを以下に追加しました、これはあなたがまだあなたがそうであるように行くことを計画しているなら助けになります:)

<IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine on
  RewriteBase /
  #
  # Do not apply rewrite rules for non required areas 
    RewriteCond %{REQUEST_URI} "/hidden-areas/" [OR]
    RewriteCond %{REQUEST_URI} "/other-areas/"
    RewriteRule (.*) $1 [L]

  # Do Not apply if a specific file or folder exists
  # RewriteCond %{REQUEST_FILENAME} !-f
  # RewriteCond %{REQUEST_FILENAME} !-d
  # The rules on how to rewrite the urls

  RewriteRule ^([a-zA-Z0-9_-]+)$ /index.php?slug=$1 [QSA,L]  
  RewriteRule ^([a-zA-Z0-9_-]+)/$ /index.php?type=$1 [QSA,L]  
  RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ /index.php?type=$1&slug=$2 [QSA,L]  
  RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$ /index.php?type=$1&cat=$2 [QSA,L]
  RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ /index.php?type=$1&cat=$2&slug=$3 [QSA,L] 
</IfModule>
于 2013-02-20T13:25:42.670 に答える
0

ありがとう、で終わりました

RewriteRule ^shop$                             shop.php [L]
RewriteRule ^shop/([0-9]+)$                    products.php?categoryid=$1 [L]
RewriteRule ^shop/([0-9]+)/(page-[0-9]+)$      products.php?categoryid=$1&page=$2 [L]
RewriteRule ^shop/([0-9]+)/([0-9]+)$           description.php?categoryid=$1&productid=$2 [L]
于 2013-02-20T13:51:29.160 に答える