Menyampaikan hujah kepada program. Parameter fungsi utama (argc, argv)

Htaccess adalah pilihan fail konfigurasi Apache, yang membolehkan anda mengkonfigurasi pelayan web untuk setiap direktori individu tanpa menjejaskan direktori global tetapan Apache. Analogi tempatan httpd.conf. Biasanya dia bertanggungjawab untuk ubah hala dan kawalan akses direktori.

Nama bermula dengan titik. Kita boleh mengatakan bahawa ini adalah fail tanpa tajuk dengan sambungan htaccess.

Tetapan .htaccess mempengaruhi direktori di mana ia berada dan semua direktori kanak-kanak. Buat fail dan letakkan dalam direktori yang anda perlukan. Sebagai contoh, kepada akar projek.

Sekarang anda perlu mengisinya. Mari lihat apa yang .htaccess boleh lakukan, tetapi pertama sekali, mari kita kaji contoh ubah hala mudah.

mod_rewrite dan ubah hala

Pastikan bahawa dalam fail konfigurasi Apache anda httpd.conf diaktifkan mod_rewrite. Iaitu, baris yang sepadan tidak diulas:

LoadModule rewrite_module modules/mod_rewrite.so

Atau, jika anda tidak mahu membukanya penyunting teks fail, anda boleh menggunakan arahan dalam terminal:

Sudo a2enmod tulis semula

mod_rewrite ialah modul Apache, direka untuk mengubah URL. Mari lihat contoh cara ia berfungsi. Katakan pengguna memasukkan alamat berikut:

Menggunakan mod_rewrite anda boleh menghantar kandungan dari URL lain, seperti ini:

Http://www.example.com/public/src/view/page.html

Mengapa kita memerlukan ini? Mudah meneka apa yang hendak ditulis laluan penuh sampai ke halaman adalah panjang dan menyusahkan. Pelawat tapak tidak perlu memikirkan struktur dalaman tapak - adalah penting bagi mereka untuk sampai ke halaman yang mereka cari secepat mungkin.

DALAM bar alamat pengguna masih akan melihat apa yang dia masukkan:

http://www.example.com/page.html

Ini adalah contoh ubah hala yang paling mudah.

Terus untuk berlatih

Mari analisa fail konfigurasi yang digunakan dalam salah satu projek kami. Dengan cara ini kita akan memahami baris mana yang hendak diedit jika masalah timbul.

Php_value short_open_tag 1 php_value upload_max_filesize 10M php_value post_max_size 10M RewriteEngine On RewriteBase / RewriteRule ^(aplikasi|modul|sistem) - RewriteCond %(REQUEST_FILENAME) !-f %RewriteCond php/$0

  • php_value menetapkan rentetan dan nilai berangka
  • php_flag menetapkan nilai boolean (ya/tidak)

Sintaks arahan am

Php_value/php_flag directive_name php flag/value

Arahan short_open_tag membenarkan penggunaan sintaks pendek untuk memformat kod PHP:

Php_value short_open_tag 1

upload_max_filesize mentakrifkan saiz maksimum fail yang dimuat turun.

Php_value upload_max_filesize 10M

A post_max_size menetapkan saiz maksimum data yang dibenarkan dihantar kaedah POST.

Php_nilai post_maks_saiz 10J

Tulis SemulaEnjin

Menghidupkan/mematikan mekanisme mod_rewrite.

Tulis SemulaEnjin Hidup

RewriteRule

RewriteRule hanya mengubah rentetan mengikut ungkapan biasa.

Sintaks: RewriteRule regular_expression

# Input RewriteRule "index.php" RewriteRule ^index.php main.php [R] # Output: "index.php" -> "main.php"

Kami menukar index.php kepada main.php dan melakukan ubah hala.

Penting: RewriteRule biasanya mengambil dua hujah: Apa perlu diganti dan untuk apa perlu diganti. Jika kami tidak perlu melakukan penggantian, kami boleh menulisnya dalam borang:

Simbol "-" bermaksud "tidak menukar"

RewriteBase

Selepas semua RewriteRules, RewriteBase mula berkuat kuasa. Jika pertanyaan yang terhasil selepas transformasi adalah relatif dan berbeza daripada pertanyaan asal, RewriteBase akan memulihkannya, menjadikannya mutlak. RewriteBase hanya akan menambahkan dirinya pada permintaan di sebelah kiri. Kerana nilai RewriteBase ialah laluan dari akar tapak ke .htaccess. Dalam kes kami, .htaccess terletak betul-betul dalam akar, jadi:

Sintaks: RewriteBase URL-path-from-.htaccess-file-to-site-root

Sebagai contoh:

# .htaccess terletak di /dir/ # Laluan dari akar tapak ke .htaccess /dir/ RewriteBase /dir/ # Minta http://example.com/dir/logo.gif # Input RewriteRule ialah "logo.gif" RewriteRule ^ logo.gif$ logo-orange.gif # Selepas RewriteRule: "logo.gif" -> "logo-orange.gif" # Selepas RewriteBase: "logo-orange.gif" -> "/dir/logo-orange. gif"

Ekspresi biasa

Ungkapan biasa yang mungkin anda temui dalam .htaccess.

Simbol Maknanya Contoh
. Sesiapa simbol c.t ialah kucing, katil bayi, potong, dll.
+ Satu atau lebih sama watak a+ ialah a, aa, aaa, dsb.
* Sifar atau beberapa sama watak a* berfungsi sama seperti a+ tetapi dalam kes a* keadaan juga akan dipenuhi baris kosong
? Padanan pilihan colou?r akan sesuai dengan kedua-dua warna dan warna.
^ Simbol dari mana bermula barisan ^a sepadan dengan rentetan yang bermula dengan a
$ Simbol itu berakhir barisan a$ sepadan dengan rentetan yang berakhir dengan .
() Cari dan ingat padanan kumpulan watak.

Boleh juga digunakan untuk Rujukan Belakang(lihat contoh)

(ab)+ akan memuaskan hati ababab

Contoh Rujukan Belakang:

RewriteRule ^/ (+) /(.*) $ /home?page= $1 &id= $2

/album/123 → /home?page= album&id= 123

Satu daripada watak yang mungkin ct sesuai dipotong, katil bayi atau kucing.

Lebih banyak ungkapan biasa

Bendera

Sintaks: RewriteRule regular_expression [flag1, flag2, flag3]

Bendera Penerangan
[F] Dilarang- mengembalikan ralat 403 Dilarang.
[L] Terakhir- hentikan proses transformasi pada ketika ini dan jangan gunakan lagi peraturan transformasi.
Rentetan Pertanyaan Ditambah- bendera ini menunjukkan kepada mekanisme penukaran untuk menambah, bukan menggantikan,pertanyaan rentetan daripada URL kepada sedia ada, dalam rentetan penggantian.
Melalui- menghentikan proses penukaran dan menghantar yang diterima pautan baharu lebih ke bawah rantaian.
[R] Ubah hala- menghentikan proses penukaran dan mengembalikan hasilnya kepada pelayar klien sebagai ubah hala ke halaman baharu.
[S] Langkau- rindu peraturan seterusnya, jika peraturan semasa berfungsi. Anda boleh menentukan bilangan peraturan berikutnya untuk diabaikan.

Ia berlaku bahawa data dipindahkan ke program dari baris arahan apabila ia dipanggil. Data sedemikian dipanggil argumen baris arahan. Ia kelihatan seperti ini, sebagai contoh:

./a.out test.txt ls -lt /home/peter/

Di sini program a.out dipanggil (dari direktori semasa) dan ls (daripada direktori yang sama yang dinyatakan dalam pembolehubah persekitaran PATH). Program pertama dari baris arahan menerima satu perkataan - test.txt, yang kedua - dua: -lt dan /home/peter/.

Jika program ditulis dalam C, maka apabila ia dilancarkan, kawalan segera dipindahkan ke fungsi main(), oleh itu, ia adalah fungsi yang menerima argumen baris arahan yang diberikan kepada pembolehubah parameternya.

Sebelum ini, kami mentakrifkan fungsi main() seolah-olah ia tidak mengambil parameter dan tidak mengembalikan apa-apa. Malah, dalam bahasa C, mana-mana fungsi secara lalai (jika tiada yang lain ditakrifkan) mengembalikan integer. Anda boleh yakin tentang ini. Jika anda menulis kod dengan cara ini:

main() ( printf ("Hai \n"); pulangan 0; )

Kemudian tiada amaran atau ralat akan berlaku semasa penyusunan. Perkara yang sama berlaku jika anda menulis int main() . Ini membuktikan bahawa fungsi secara lalai mengembalikan integer dan bukan tiada (kosong). Walaupun fungsi yang dikembalikan sentiasa boleh "ditindih", contohnya, voidmain() atau float main() .

Apabila memanggil program dari baris arahan, pasangan data berikut sentiasa dihantar ke dalamnya:

  1. integer, menunjukkan bilangan perkataan (elemen yang dipisahkan oleh ruang) pada baris arahan apabila dipanggil,
  2. penunjuk kepada tatasusunan rentetan, di mana setiap baris berada perkataan berasingan daripada baris arahan.

Perlu diingat bahawa nama program itu sendiri juga penting. Sebagai contoh, jika panggilan kelihatan seperti ini:

./a.out 12 tema 2

Kemudian hujah pertama program mempunyai nilai 4, dan tatasusunan rentetan ditakrifkan sebagai ("./a.out", "12", "theme", "2").

Perhatikan terminologi, hanya terdapat dua argumen program (nombor dan tatasusunan), tetapi seberapa banyak argumen baris perintah yang anda suka. Argumen baris arahan "ditukar" menjadi argumen program (ke dalam argumen fungsi main()).
Data ini (nombor dan penuding) dihantar kepada atur cara walaupun ia hanya dipanggil dengan nama tanpa menghantar apa-apa kepadanya: ./a.out. Dalam kes ini, argumen pertama mempunyai nilai 1, dan yang kedua menunjuk kepada tatasusunan yang terdiri daripada hanya satu baris ("./a.out").

Hanya kerana data dihantar ke dalam atur cara tidak bermakna fungsi main() mesti menerimanya. Jika fungsi main() ditakrifkan tanpa parameter, maka tidak mungkin untuk mengakses argumen baris arahan. Walaupun tiada apa yang menghalang anda daripada menghantarnya. Tidak akan ada kesilapan.

Untuk mengakses data yang dihantar ke program, ia mesti diberikan kepada pembolehubah. Oleh kerana hujah-hujah dihantar dengan serta-merta ke main() , pengepalanya sepatutnya kelihatan seperti ini:
utama (int n, char *arr)

Pembolehubah pertama (n) mengandungi bilangan perkataan, dan pembolehubah kedua mengandungi penunjuk kepada tatasusunan rentetan. Selalunya parameter kedua ditulis sebagai **arr . Walau bagaimanapun, ia adalah perkara yang sama. Ingat bahawa tatasusunan rentetan itu sendiri mengandungi penunjuk kepada rentetan sebagai elemennya. Dan kami menghantar penunjuk kepada elemen pertama tatasusunan kepada fungsi. Ternyata kita menghantar penunjuk ke penunjuk, i.e. **arr.

Senaman
Tulis program seperti ini:

#termasuk int utama(int argc, char ** argv) ( int i; printf ("%d \n", argc); untuk (i= 0 ; i< argc; i++ ) puts (argv[ i] ) ; }

Ia memaparkan bilangan perkataan pada baris arahan apabila ia dipanggil dan setiap perkataan dengan baris baru. Panggilnya tanpa hujah baris arahan dan dengan hujah.

Dalam program ini kami menggunakan pembolehubah parameter argc dan argv. Ia adalah kebiasaan untuk menggunakan nama-nama ini, tetapi sebenarnya mereka boleh menjadi apa sahaja. Adalah lebih baik untuk berpegang pada piawaian ini supaya program anda lebih mudah difahami bukan sahaja kepada anda, tetapi juga kepada pengaturcara lain.

Kepentingan praktikal memindahkan data ke program

Jika anda mempunyai sebarang pengalaman dengan baris arahan GNU/Linux, anda tahu bahawa kebanyakan arahan mempunyai suis dan hujah. Sebagai contoh, apabila melihat kandungan direktori, menyalin, memindahkan, objek sistem fail di mana perintah itu dilaksanakan dinyatakan sebagai argumen. Ciri pelaksanaannya ditentukan menggunakan kekunci. Contohnya, dalam satu pasukan

Cp -r ../les_1 ../les_101

cp ialah nama arahan, -r ialah suis, dan ../les_1 dan ../les_101 ialah hujah arahan.

Secara umum, selalunya, alamat fail dan "pengubah suai" (ini adalah kunci) proses pelaksanaan program dipindahkan ke program apabila ia dilancarkan.

Mari kita tulis program yang dibuka ditentukan oleh pengguna pada baris arahan, fail untuk menulis atau menambah dan menulis (menambah) di sana maklumat yang sama yang pengguna masukkan dari papan kekunci semasa pelaksanaan program:

#termasuk #termasuk utama (int argc, char ** argv) ( int i, ch; FAIL * f[ 5 ] ; if (argc< 3 || argc >7) (meletakkan ( "Bilangan parameter tidak sah"); pulangan 1; ) jika (strcmp (argv[ 1 ] , "-w") != 0 && strcmp (argv[ 1 ] , "-a" ) != 0 ) ( meletakkan ( "Parameter pertama boleh sama ada -w atau -a"); pulangan 2; ) untuk (i= 0 ; i< argc- 2 ; i++ ) { f[ i] = fopen (argv[ i+ 2 ] , argv[ 1 ] + 1 ) ; if (f[ i] == NULL) { printf ("Fail %s tidak boleh dibuka\n ", argv[ i+ 2 ]); pulangan 3; ) ) manakala ((ch = getchar () ) != EOF) untuk (i= 0 ; i< argc- 2 ; i++ ) putc (ch, f[ i] ) ; for (i= 0 ; i < argc- 2 ; i++ ) fclose (f[ i] ) ; return 0 ; }

Penjelasan untuk kod:

  1. Tatasusunan lima penunjuk fail dibuat. Oleh itu, anda boleh membuka tidak lebih daripada lima fail pada masa yang sama. Penunjuk fail fail pertama akan disimpan dalam elemen tatasusunan f, yang kedua - dalam f, dsb.
  2. Bilangan argumen baris arahan disemak. Sekurang-kurangnya harus ada tiga daripadanya, kerana... yang pertama ialah nama program, yang kedua ialah mod pembukaan fail, yang ketiga ialah fail pertama atau satu-satunya untuk ditulis. Memandangkan program ini membenarkan anda membuka hanya lima fail, jumlah bilangan argumen baris arahan tidak boleh lebih daripada tujuh. Oleh itu, jika bilangan hujah kurang daripada 3 atau lebih daripada 7, maka program tamat, kerana Pernyataan pulangan menyebabkan fungsi keluar, walaupun terdapat lebih banyak kod selepasnya. Nilai yang dikembalikan daripada fungsi yang tidak sama dengan 0 boleh ditafsirkan oleh proses induk sebagai mesej bahawa atur cara ditamatkan dengan ralat.
  3. Menyemak kesahihan hujah baris arahan kedua. Jika ia bukan "-w" mahupun "-a", maka ungkapan bersyarat dalam kedua jika mengembalikan 1 (benar). Fungsi strcmp() membolehkan anda membandingkan rentetan dan mengembalikan 0 jika ia sama.
  4. DALAM untuk gelung fail dibuka oleh alamat yang ditentukan, yang bermula dari elemen ketiga tatasusunan argv. Inilah sebabnya mengapa 2 ditambah kepada i untuk mendapatkan elemen tatasusunan argv, bermula dari yang ketiga. Ungkapan argc-2 menunjukkan bilangan nama fail yang diluluskan; kerana argc menyimpan jumlah bilangan argumen baris arahan, dua yang pertama bukan nama fail.
  5. Ungkapan argv+1 membolehkan anda "memotong" subrentetan "w" (atau "a") daripada rentetan "-w" (atau "-a"), kerana argv pada asasnya adalah penunjuk kepada elemen pertama rentetan. Dengan menambahkan satu pada penuding, kami mengalihkannya ke elemen tatasusunan seterusnya.
  6. Jika fail tidak boleh dibuka, fungsi fopen() mengembalikan NULL. Dalam kes ini, program berakhir.
  7. Setiap aksara yang dimasukkan oleh pengguna pada papan kekunci ditulis pada semua fail yang terbuka.
  8. Pada akhirnya fail ditutup.

Artikel ini berkembang daripada idea untuk latihan lanjutan untuk pekerja kami sokongan teknikal bekerja dengan mod_rewrite. Amalan telah menunjukkan bahawa selepas mengkaji sejumlah besar buku teks dalam bahasa Rusia, kakitangan sokongan mahir dalam menyelesaikan masalah templat, tetapi penyusunan peraturan bebas berlaku melalui percubaan dan kesilapan. Kuantiti yang besar kesilapan. Masalahnya ialah pemahaman yang baik tentang cara mod_rewrite berfungsi memerlukan mempelajari dokumentasi bahasa Inggeris asal, diikuti dengan penjelasan tambahan atau jam percubaan dengan RewriteLog.

Artikel itu menerangkan cara mod_rewrite berfungsi. Memahami prinsip operasinya membolehkan anda memahami dengan jelas kesan setiap arahan dan membayangkan dengan jelas apa yang berlaku pada satu masa atau yang lain di dalam mod_rewrite semasa memproses arahan.

Saya menganggap bahawa pembaca sudah biasa dengan apa itu mod_rewrite, dan saya tidak akan menerangkan asasnya, yang mudah dicari di Internet. Perlu diingatkan juga bahawa artikel itu merangkumi kerja mod_rewrite apabila menggunakan arahannya dalam fail .htaccess. Perbezaan apabila bekerja dalam konteks ditetapkan dalam.

Oleh itu, anda telah mempelajari mod_rewrite, menyusun beberapa RewriteRules dan berjaya menemui ubah hala yang tidak berkesudahan, kes apabila peraturan atas sebab tertentu tidak menangkap permintaan anda, serta pengendalian sekumpulan peraturan yang tidak dapat diramalkan apabila peraturan berikutnya secara tidak dijangka mengubah permintaan yang telah disediakan dengan teliti oleh peraturan sebelumnya.

Apakah fungsi RewriteRule?

RewriteRule pertama dilalui laluan dari mana .htaccess terletak ke fail yang diminta. Baris ini tidak pernah bermula dengan "/". RewriteRules seterusnya menghantar hasil transformasi sebelumnya.

Untuk memahami secara menyeluruh cara RewriteRule berfungsi, anda mesti terlebih dahulu mentakrifkan apa yang ia berfungsi. Mari lihat cara Apache menerima rentetan yang pada mulanya dihantar ke RewriteRule dalam .htaccess untuk diproses.

Apabila anda mula bekerja dengan mod_rewrite, anda secara logik menganggap bahawa ia berfungsi dengan pautan. Walau bagaimanapun, ini tidak berlaku apabila menggunakan mod_rewrite dalam .htaccess. Sebenarnya, ia bukan pautan yang dihantar ke RewriteRule, tetapi laluan ke fail yang diminta.

Disebabkan oleh seni bina dalaman Apache, saat .htaccess mula dimainkan, mod_rewrite hanya boleh beroperasi pada laluan ke fail yang perlu diproses. Ini disebabkan oleh fakta bahawa sebelum dihantar ke mod_rewrite, permintaan itu mungkin telah diubah suai oleh modul lain (contohnya, mod_alias), dan laluan terakhir ke fail di tapak mungkin tidak lagi bertepatan dengan pautan asal. Jika mod_rewrite berfungsi pada rujukan asal, ia akan memecahkan tindakan modul yang mengubah suai permintaan sebelum itu.

Oleh itu, mod_rewrite diluluskan laluan mutlak ke fail yang perlu diproses. Mod_rewrite juga mengetahui laluan ke .htaccess, di mana peraturan RewriteRule terletak. Untuk menjadikan laluan ke fail itu serupa dengan pautan yang pembangun tapak merancang untuk bekerjasama, mod_rewrite memotong bahagian ke fail .htaccess daripada laluan mutlak.

Jadi, laluan ini, dari mana laluan ke .htaccess terputus, yang dihantar ke RewriteRule yang pertama. Sebagai contoh:

Permintaan: http://example.com/templates/silver/images/logo.gif DocumentRoot: /var/www/example.com Laluan ke fail: /var/www/example.com/templates/silver/images/logo. gif .htaccess terletak di: /var/www/example.com/templates/.htaccess

RewriteRule pertama akan menerima: silver/images/logo.gif Sila ambil perhatian: “templates/” juga telah dipotong. cara RewriteRule berfungsi Laluan ke .htaccess terputus bersama-sama dengan garis miring. Terdapat akibat daripada ini: baris yang pada mulanya dihantar ke pemprosesan RewriteRule tidak pernah bermula dengan "/".

Adalah penting untuk mengingati perkara yang tidak dilakukan oleh RewriteRule. Ia tidak memproses nama tapak, hujah yang dihantar kepada skrip dan ia tidak memproses keseluruhan pautan jika .htaccess tidak terletak dalam akar tapak. Semua ini dilakukan oleh RewriteCond, yang akan kita sentuh secara ringkas kemudian. Jadi:

# tidak akan berfungsi - peraturan bermula dengan / RewriteRule ^/index.php$ /my-index.php # tidak akan berfungsi - nama tapak tidak dianalisis RewriteRule RewriteRule ^example.com/.* http://www.example .com # tidak akan berfungsi - hujah pautan tidak termasuk dalam RewriteRule RewriteRule index.php\?newspage=(+) news.php?page=$1 # Hanya akan berfungsi jika .htaccess terletak di tempat yang sama dengan templat folder, # sebagai contoh, dalam akar tapak . Iaitu, jika .htaccess berada dalam templat/.htaccess , peraturan # TIDAK AKAN berfungsi, kerana mod_rewrite akan memotong laluan ke .htaccess dan baris akan berakhir pada input RewriteRule # tanpa "templates/" RewriteRule ^templates/ common/yandex-money. gif$ templates/shared/yad.gif

Kami mengetahui apa yang RewriteRule berfungsi. Sekarang mari kita lihat bagaimana ia berfungsi.

Cara RewriteRule berfungsi

RewriteRule hanya mengubah rentetan mengikut ungkapan biasa dan itu sahaja. RewriteRule beroperasi pada rentetan, bukan pautan atau laluan ke fail.

Seperti yang kami ketahui di atas, input RewriteRule termasuk laluan dari .htaccess ke fail yang diminta. Ia adalah paling mudah sekarang untuk mengabstrak daripada laluan dan pautan dan mempertimbangkan apa yang RewriteRule berfungsi sebagai rentetan biasa. Rentetan ini dihantar daripada RewriteRule kepada RewriteRule, diubah suai jika mana-mana RewriteRules berfungsi.

DALAM Pandangan umum Selain daripada kerumitan menggunakan bendera (sesetengahnya kita akan lihat di bawah) dan kerumitan menulis ungkapan biasa (yang tidak akan kami sentuh banyak dalam artikel ini), RewriteRule berfungsi dengan SANGAT mudah. Kami mengambil talian. Bandingkan dengan ungkapan biasa dalam hujah pertama. Jika terdapat padanan, gantikan keseluruhan rentetan dengan nilai argumen kedua. Melewati rentetan ke RewriteRule seterusnya. Itu pada dasarnya semua. Untuk menggambarkan dengan jelas bahawa RewriteRule berfungsi secara khusus dengan rentetan, pertimbangkan contoh hebat berikut:

# Permintaan: http://mysite.com/info.html # RewriteRule pertama akan mengandungi "info.html" # Tukar permintaan kepada rentetan arbitrari. RewriteRule ^info.html$ "Saya melihat seekor kura-kura di dalam lubang itu. Dan ia menari rock-n-roll. Dan ia tersenyum. Secara keseluruhannya, ia adalah anak patung yang sangat lucu." # "info.html" -> "Saya nampak penyu..." # Gantikan baris ini dengan pautan luaran. RewriteRule penyu https://example.com/information/index.html # "Saya nampak penyu..." -> "https://example.com/information/index.html" # Gantikan nama tapak! RewriteRule ^(.*)example.com(.*)$ $1example.org$2 # "https://example.com/information/index.html" -> "https://example.org/information/index. html" # Gantikan protokol! RewriteRule ^https:(.*)$ ftp:$1 # "https://example.org/information/index.html" -> "ftp://example.org/information/index.html" # Gantikan pautan akhir . RewriteRule ^(.*)/index.html$ $1/main.php # "ftp://example.org/information/index.html" -> "ftp://example.org/information/main.php"

Seperti yang anda lihat, RewriteRule tidak peduli dengan apa ia berfungsi - ia hanya mengubah rentetan mengikut hujah yang diberikan kepadanya. Jika anda mahu, anda boleh menyimpan sebarang tatasusunan data dalam rentetan, jika anda mahu, ketekunan dan ilmu yang baik Untuk ungkapan biasa, anda juga boleh menulis tic-tac-toe pada RewriteRule.

Nota perlu dibuat di sini: walaupun RewriteRule berfungsi dengan rentetan tulen, ia masih tertumpu pada bekerja dengan pautan. Oleh itu, ia akan bertindak balas dengan cara yang istimewa kepada baris yang bermula dengan

https://

atau analog (ia akan ingat bahawa kami ingin membuat ubah hala luaran) dan ke "?" (anggap aksara berikut sebagai hujah yang perlu digantikan untuk permintaan itu). Walau bagaimanapun, kami tidak berminat dengan perkara itu buat masa ini - adalah penting untuk memahami bahawa tiada keajaiban dalam RewriteRule - ia hanya memerlukan rentetan dan mengubahnya mengikut cara anda memberitahunya. Kami akan melihat ubah hala dan hujah luaran kemudian dalam artikel; terdapat sesuatu untuk dibincangkan di sana juga.

Selepas semua transformasi telah selesai dan RewriteRule terakhir telah dilaksanakan, RewriteBase berkuat kuasa.

Untuk apa RewriteBase digunakan?

Jika pertanyaan yang terhasil adalah relatif dan berbeza daripada pertanyaan asal, RewriteBase akan menambah sendiri di sebelah kiri pertanyaan itu. Ia adalah perlu untuk menentukan RewriteBase dalam .htaccess. Nilainya ialah laluan dari akar tapak ke .htaccess. RewriteBase dilaksanakan hanya selepas semua RewriteRules, bukan di antara mereka.

Kami telah menyatakan di atas bahawa mod_rewrite, yang berfungsi dalam .htaccess, mengandungi laluan mutlak ke fail yang diminta. Untuk menghantarnya ke RewriteRule, mod_rewrite memotong laluan ke .htaccess. Kemudian RewriteRules menukar permintaan secara berurutan satu demi satu. Dan kini, selepas permintaan itu diubah suai, Apache mesti memulihkan laluan mutlak ke fail yang mesti diproses akhirnya. RewriteBase sebenarnya adalah hack yang membantu memulihkan laluan asal fail.

RewriteBase dilaksanakan selepas semua transformasi. Ini bermakna ia tidak akan mengubah permintaan antara RewriteRules, tetapi hanya akan berkuat kuasa apabila semua RewriteRules telah selesai.

Selepas semua transformasi, RewriteBase melihat sama ada laluan yang terhasil adalah relatif atau mutlak. Dalam konteks Apache, ini bermaksud laluan relatif atau mutlak, bermula dari akar tapak: images/logo.gif - relative. /images/logo.gif - mutlak (slash pada permulaan). http://example.com/images/logo.gif - yang paling mutlak. Jika laluan adalah mutlak, RewriteBase tidak melakukan apa-apa. Dan jika ia adalah relatif, RewriteBase menambahkan dirinya ke sebelah kiri. Ini berfungsi untuk ubah hala dalaman dan luaran:

# .htaccess terletak dalam /images/ # RewriteBase ditentukan /images/ RewriteBase /images/ # Request http://example.com/images/logo.gif # Input RewriteRule ialah "logo.gif" RewriteRule ^logo.gif $ logo -orange.gif # Selepas RewriteRule: "logo.gif" -> "logo-orange.gif" # Selepas RewriteBase: "logo-orange.gif" -> "/images/logo-orange.gif" # Minta http :/ /example.com/images/header.png # Input RewriteRule ialah "header.png" RewriteRule ^header.png$ /templates/rebranding/header.png # Selepas RewriteRule: "header.png" -> "/ templates/rebranding /header.png" # After RewriteBase: tiada apa-apa perubahan, jadi hasil akhir transformasi bermula dengan "/". # Minta http://example.com/images/director.tiff # Input RewriteRule ialah "director.tiff" # Kami menggunakan ubah hala relatif luaran RewriteRule ^director.tiff$ staff/manager/director.tiff # Selepas RewriteRule: "pengarah. tiff" -> "kakitangan/pengurus/pengarah.tiff" # + mod_rewrite teringat bahawa akan ada ubah hala luaran # Selepas RewriteBase: "staff/manager/director.tiff" -> "/images/staff/manager/ director.tiff" # mod_rewrite teringat tentang ubah hala luaran: # "/images/staff/manager/director.tiff" -> http://example.com/images/staff/manager/director.tiff

Biasanya, selepas beberapa kebiasaan dengan mod_rewrite, tabiat berikut berkembang:

    tambah “RewriteBase /” pada setiap .htaccess

    Semua ubah hala bermula dengan garis miring: "RewriteRule news.php /index.php?act=news". Ini membantu untuk menyingkirkan artifak daripada RewriteBase, tetapi adalah salah untuk melakukan ini. Sekarang kita tahu apa yang dilakukan oleh RewriteBase, kita boleh merumuskan peraturan yang betul berikut:

RewriteBase mesti sepadan dengan laluan dari akar tapak ke .htaccess. Anda hanya perlu memulakan ubah hala dengan "/" apabila anda perlu menentukan laluan mutlak dari akar tapak ke fail.

Apa yang berlaku jika anda tidak menentukan RewriteBase? Secara lalai Apache menjadikannya sama jalan mutlak pada sistem fail to.htaccess (contohnya /var/www/example.com/templates/). Kesalahan andaian Apache ini ditunjukkan dalam ubah hala relatif luaran:

# Minta http://example.com/index.php # DocumentRoot: /var/www/example.com/ # .htaccess berada pada akar tapak dan TIDAK mempunyai RewriteBase yang ditentukan. # Oleh itu, secara lalai, RewriteBase adalah sama dengan laluan mutlak ke.htaccess: /var/www/example.com/ # Input RewriteRule ialah "index.php" RewriteRule ^index.php main.php [R] # Output ialah "index.php" " -> "main.php" # mod_rewrite teringat bahawa ubah hala luaran diperlukan # RewriteRule habis # mod_rewrite masih melaksanakan RewriteBase, kerana ia mempunyai nilai lalai. # Ternyata: "main.php" -> "/var/www/example.com/main.php" # Di sini mod_rewrite ingat bahawa terdapat ubah hala luaran: # "/var/www/example.com/main. php" - > http://example.com/var/www/example.com/main.php # Ternyata tidak sama sekali apa yang mereka fikirkan.

Jadi, permintaan itu melalui semua RewriteRules, selepas itu, jika perlu, RewriteBase telah ditambahkan padanya. Sekiranya Apache kini menyampaikan fail yang dituju oleh laluan yang terhasil? Tidak. Sekarang permintaan yang terhasil akan diproses semula.

Cara mod_rewrite berfungsi. Benderakan [L]

mod_rewrite mula memproses permintaan berulang kali sehingga ia berhenti berubah. Dan bendera [L] tidak boleh menghalangnya.

Apabila mencipta konfigurasi mod_rewrite yang lebih kompleks, adalah penting untuk memahaminya pengubahsuaian pertanyaan tidak berakhir pada RewriteRule yang terakhir. Selepas ia berfungsi peraturan terakhir RewriteRule dan RewriteBase telah ditambah, mod_rewrite melihat untuk melihat sama ada permintaan telah berubah atau tidak. Jika permintaan telah berubah, pemprosesannya bermula semula dari permulaan.htaccess.

Apache melakukan ini kerana dalam proses menukar permintaan, ia mungkin telah diubah hala ke direktori lain. Ia mungkin mempunyai .htaccess sendiri yang tidak terlibat dalam pemprosesan permintaan sebelumnya. .htaccess baharu ini mungkin mengandungi peraturan yang mempengaruhi pemprosesan permintaan - peraturan mod_rewrite dan peraturan modul lain. Untuk mengendalikan situasi ini dengan betul, Apache mesti memulakan semula keseluruhan gelung pemprosesan.

Tunggu, tetapi ada bendera [L], yang berhenti memproses permintaan mod_rewrite!

Tidak pasti dengan cara itu. Bendera [L] menghentikan lelaran semasa pemprosesan permintaan. Walau bagaimanapun, jika permintaan itu diubah suai oleh RewriteRules yang masih berjaya memproses, Apache akan memulakan kitaran pemprosesan permintaan sekali lagi daripada RewriteRule yang pertama.

# Permintaan: http://example.com/a.html RewriteBase / RewriteRule ^a.html$ b.html [L] RewriteRule ^b.html$ a.html [L]

Contoh di atas akan menghasilkan gelung ubah hala yang tidak terhingga dan "Dalaman Ralat Pelayan" akhirnya. Dalam contoh ini, gelung tak terhingga adalah jelas, tetapi dalam konfigurasi yang lebih kompleks anda mungkin perlu menggali peraturan untuk menentukan permintaan yang bergelung antara satu sama lain.

Untuk mengelakkan situasi sedemikian, adalah disyorkan untuk menggunakan bendera [L] hanya apabila perlu. Keperluan boleh terdiri daripada dua jenis: Apabila ubah hala luaran digunakan - atau . Dalam kes ubah hala luaran, pemprosesan selanjutnya permintaan adalah tidak diingini (lihat di bawah tentang bendera [R]), dan lebih baik menghentikannya. Apabila terdapat gelung dalam .htaccess yang tidak boleh dihapuskan, dan pemprosesan permintaan oleh mod_rewrite mesti dihentikan secara paksa. Dalam kes ini, pembinaan khas digunakan - lihat petua mengenai topik ini di penghujung artikel.

Tetapi contoh di bawah tidak akan gelung. Cuba tentukan mengapa dan fail mana yang akan diberikan kepada Apache pada akhirnya.

# Permintaan: http://example.com/a.html # Start.htaccess RewriteBase / RewriteRule ^a.html$ b.html RewriteRule ^b.html$ a.html # End.htaccess

Penyelesaian: Hasil daripada melaksanakan semua RewriteRules, permintaan diubah sedemikian rupa sehingga hasil akhir adalah sama dengan yang asal. Apache melihat ini dan tidak memproses semula permintaan itu. Fail a.html akan dikembalikan.

Cara mod_rewrite berfungsi. Benderakan [R]

    Bendera [R] tidak berhenti meminta pemprosesan, mengembalikan ubah hala luaran serta-merta. Sebaliknya, ia mengingati keperluan untuk ubah hala luaran dan pemprosesan permintaan diteruskan dengan RewriteRule berikut. Adalah disyorkan untuk sentiasa menggunakan dengan bendera [L].

    Bendera [R] memberitahu Apache bahawa ia perlu melakukan ubah hala luaran dan bukannya dalaman. Apakah perbezaan antara ubah hala luaran dan dalaman? Ubah hala dalaman hanya menukar laluan ke fail yang akan diberikan kepada pengguna, manakala pengguna percaya bahawa dia menerima fail yang dia minta pada asalnya. Dengan ubah hala luaran, Apache mengembalikan status respons 301 atau 302 kepada pengguna dan bukannya kandungan fail dan memaklumkan pengguna tentang pautan yang harus digunakan oleh penyemak imbas untuk mendapatkan fail.

Nampaknya apabila memproses bendera [R] Apache harus segera menghentikan pemprosesan RewriteRule dan mengembalikan ubah hala luaran kepada pengguna. Walau bagaimanapun, mari kita ingat contoh hebat dari bahagian How RewriteRule Works. Di dalamnya kami mula-mula menunjukkan bendera [R], menunjukkan keperluan untuk ubah hala luaran, selepas itu mereka terus menukar pautan dengan RewriteRule berikut.

Beginilah cara Apache berfungsi apabila menentukan ubah hala luaran. Ia hanya "nota" kepada dirinya sendiri bahawa selepas melaksanakan semua peraturan adalah perlu untuk mengembalikan status 302 (lalai), tetapi pada masa yang sama terus melaksanakan semua RewriteRules lebih jauh ke bawah senarai. Kami boleh terus menukar permintaan seperti yang kami perlukan, satu-satunya perkara yang tidak akan berfungsi ialah menjadikan ubah hala semula dalaman.

Walau bagaimanapun, tidak mungkin anda ingin mengubahnya dalam apa jua cara selepas menghantar ubah hala luaran. Oleh itu, adalah disyorkan apabila menggunakan bendera [R] menunjukkannya bersama-sama dengan [L]:

# BlackJack telah berpindah ke nama cantik RewriteRule ^bj/(.*) blackjack/$1 # Anda hanya boleh menggunakan pautan luaran RewriteRule ^bj/(.*) http://blackjack.example.com/$1 [L]

Daripada menggunakan bendera [R] Anda hanya boleh memberikan pautan luaran. Dalam kes ini, Apache sendiri akan meneka bahawa perlu untuk membuat ubah hala luaran. Di sini, seperti dalam kes menyatakan bendera secara jelas [R], adalah disyorkan untuk menggunakan bendera [L]. Jika ubah hala luaran membawa ke tapak yang sama, lebih baik menggunakan bendera [R] tanpa petunjuk pautan penuh(dengan kata lain, gunakan ubah hala luaran relatif). Ini akan menjadikan peraturan bebas daripada nama tapak. Jika ubah hala luaran mengarah ke tapak lain, ini tidak boleh dilakukan selain dengan menentukan pautan luaran penuh.

Cara mod_rewrite berfungsi. Menentukan parameter permintaan dan bendera

Menukar parameter pertanyaan dalam RewriteRule tidak mengubah baris yang RewriteRule seterusnya beroperasi. Walau bagaimanapun, menukar parameter mengubah %(QUERY_STRING) pembolehubah yang boleh digunakan oleh RewriteCond.

Terminologi yang digunakan: "parameter" - parameter permintaan, "argumen" - argumen RewriteRule.

Menggunakan RewriteRule, anda boleh menukar bukan sahaja laluan ke fail yang akan diproses, tetapi juga parameter DAPATKAN permintaan yang akan disampaikan kepadanya. Ini sering digunakan untuk memindahkan pemprosesan NC kepada skrip pengendali generik, cth: RewriteBase /

# Permintaan: http://example.com/news/2010/07/12/grand-opening.html # Input: "news/2010/07/12/grand-opening.html" RewriteRule ^news/(.* ) $ index.php?act=news&what=$1 # After RewriteRule: "news/2010/07/12/grand-opening.html" -> "index.php" # %(QUERY_STRING): "" -> "act= news&what =2010/07/12/grand-opening.html"

Sebaik sahaja RewriteRule menemui tanda soal dalam hujah kedua, ia mengetahui bahawa parameter dalam permintaan sedang diubah suai. Apa yang berlaku akibatnya ialah RewriteRule menggantikan rentetan yang berfungsi dengan sebahagian daripada hujah kedua sebelum tanda soal. Sila ambil perhatian bahawa parameter permintaan baharu tidak berakhir dalam rentetan yang RewriteRules seterusnya akan berfungsi. Bahagian hujah kedua selepas tanda soal berakhir dalam pembolehubah %(QUERY_STRING). Jika bendera ditentukan , parameter pertanyaan akan ditambahkan pada permulaan %(QUERY_STRING). Jika bendera tidak dinyatakan, %(QUERY_STRING) akan digantikan sepenuhnya oleh parameter pertanyaan daripada RewriteRule. Beberapa lagi contoh:

RewriteBase / # Request: http://example.com/news/2010/?page=2 # Input RewriteRule: "news/2010/" RewriteRule ^news/(.*)$ index.php?act=news&what=$1 # Selepas penukaran: "news/2010/" -> "index.php" # Nilai %(QUERY_STRING): "page=2" -> "act=news&what=2010/" Kemungkinan besar, peraturan di atas tidak berfungsi dengan betul, kerana ia adalah halaman hujah yang hilang. Mari kita betulkan ini: RewriteBase / # Request: http://example.com/news/2010/?page=2 # Input RewriteRule: "news/2010/" RewriteRule ^news/(.*)$ index.php?act= news&what=$1 # Selepas penukaran: "news/2010/" -> "index.php" # Value %(QUERY_STRING): "page=2" -> "act=news&what=2010/&page=2"

Adalah penting untuk memahami bahawa menukar parameter pertanyaan mengubah %(QUERY_STRING) yang boleh digunakan kemudian dalam RewriteCond. Ini mesti diambil kira semasa menulis peraturan seterusnya yang menyemak hujah.

Sudah tentu, ia berubah, kerana permintaan dihantar untuk pemprosesan semula oleh Apache!

Tidak, %(QUERY_STRING) berubah serta-merta. Saya tidak akan memberikan bukti - lebih banyak yang telah ditulis tentang parameter daripada yang menarik untuk dibaca :)

Apakah yang boleh anda lakukan untuk menyemak dalam RewriteCond betul-betul parameter permintaan yang telah diluluskan oleh pengguna, dan bukan yang diubah suai oleh RewriteRules? Lihat petua di penghujung artikel.

RewriteCond dan prestasi

Mula-mula, padanan permintaan dengan RewriteRule disemak, dan hanya kemudian - syarat-syarat tambahan Tulis SemulaCond.

Beberapa perkataan harus dikatakan tentang susunan mod_rewrite melaksanakan arahan. Memandangkan .htaccess disertakan dengan RewriteCond dahulu dan kemudian RewriteRule, nampaknya mod_rewrite menyemak semua syarat dahulu dan kemudian mula melaksanakan RewriteRule.

Malah, semuanya berlaku sebaliknya. Mula-mula, mod_rewrite menyemak sama ada nilai permintaan semasa sepadan dengan ungkapan biasa RewriteRule, dan hanya selepas itu ia akan menyemak semua syarat yang disenaraikan dalam RewriteCond.

Jadi, jika anda mempunyai ungkapan biasa dua halaman dalam RewriteRule anda dan, memikirkan tentang prestasi, anda memutuskan untuk mengehadkan pelaksanaan peraturan ini kepada RewriteConds tambahan, anda harus tahu bahawa tiada apa yang akan berfungsi. Dalam kes ini, lebih baik menggunakan bendera RewriteRule [C] atau [S] untuk melangkau lebih banyak lagi. peraturan yang kompleks, jika lebih semakan mudah tidak berjaya.

Pembolehubah dan bendera RewriteCond, bendera RewriteRule lain, dsb.

Baca dokumentasi.

Kami berkenalan dengan prinsip operasi RewriteRule, RewriteBase, bendera [L], [R] Dan , dan juga menganalisis mekanisme pemprosesan permintaan di dalam mod_rewrite. Perkara berikut kekal tidak terjejas: bendera RewriteRule lain, arahan RewriteCond dan RewriteMap.

Nasib baik, arahan dan bendera ini tidak penuh dengan sebarang misteri dan berfungsi dengan tepat seperti yang diterangkan dalam kebanyakan tutorial. Untuk memahami mereka, baca sahaja dokumentasi rasmi. Pertama sekali, saya syorkan anda mengkaji senarai pembolehubah yang boleh disemak dalam RewriteCond - %(QUERY_STING), %(THE_REQUEST), %(REMOTE_ADDR), %(HTTP_HOST), %(HTTP:header), dsb.)

Perbezaan dalam cara mod_rewrite berfungsi dalam konteks .htaccess dan dalam konteks VirtualHost

Dalam konteks mod_rewrite berfungsi sebaliknya.

Seperti yang saya katakan pada permulaan artikel, semua yang diterangkan di atas berkenaan dengan penggunaan mod_rewrite dalam konteks .htaccess. Jika mod_rewrite digunakan dalam , ia akan berfungsi secara berbeza: Dalam RewriteRule merangkumi keseluruhan laluan permintaan, bermula dari garis miring pertama dan berakhir dengan permulaan GET parameter: "http://example.com/some/news/category/post.html?comments_page=3" → "/news/category/post.html". Baris ini sentiasa bermula dengan /. Argumen kedua RewriteRule juga mesti bermula dengan /, jika tidak, ia akan menjadi "Permintaan Buruk". RewriteBase tidak masuk akal. Meluluskan peraturan berlaku sekali sahaja. Bendera [L] sebenarnya selesai memproses semua peraturan yang diterangkan dalam , tanpa sebarang lelaran lanjut.

Menulis Ungkapan Biasa

Cuba karang ungkapan biasa supaya mereka mentakrifkan dengan tepat pertanyaan yang anda ingin ubah suai - supaya peraturan RewriteRule tidak berfungsi secara tidak sengaja untuk pertanyaan lain. Sebagai contoh:

# Mulakan semua ungkapan biasa dengan "^" (permulaan baris) # dan berakhir dengan "$" (akhir baris): RewriteRule ^news.php$ index.php # Walaupun ini tidak perlu - untuk serba boleh dan pemahaman yang lebih baik tentang konfigurasi: RewriteRule ^news/(.*)$ index.php # Jika hanya nombor perlu disertakan dalam topeng, nyatakan ini dengan jelas. # Jika beberapa nombor adalah tetap, nyatakan secara eksplisit. # Jika garis miring tidak dapat hadir dalam permintaan yang lain, hadkan kehadirannya. # Jangan lupa untuk melarikan diri "." (titik). # Peraturan berikut menyasarkan pertanyaan seperti http://example.com/news/2009/07/28/b-effect.html RewriteRule ^news/20(2)/(2)/(2)/[^/]+ \.html index.php

Namun, oh ungkapan biasa Terdapat keseluruhan bahagian pada satu laman web yang terkenal.

Menukar ubah hala luaran

Walaupun fakta bahawa mod_rewrite membenarkan anda menukar malah ubah hala luaran menggunakan RewriteRule, sehingga ke protokol, saya sangat tidak mengesyorkan melakukan ini. Dalam artikel, contoh menukar ubah hala luaran hanya digunakan untuk menyingkirkan konsep seperti "pautan" dan "fail" dan lebih jelas menunjukkan bahawa RewriteRule berfungsi dengan rentetan mudah.

Saya tidak fikir pembangun mod_rewrite bermaksud sesiapa sahaja akan melakukan ini, jadi semua jenis artifak boleh dilakukan. Tolong jangan buat begini.

Bagaimana untuk menghentikan gelung tak terhingga

Kadangkala logik ubah hala pada tapak adalah sedemikian rupa tanpa tindakan khas mod_rewrite menganggapnya sebagai gelung ubah hala yang tidak berkesudahan. Mari kita ambil contoh berikut.

Tapak ini mempunyai halaman /info.html. Pakar SEO memutuskan itu enjin carian akan mengindeks halaman ini dengan lebih baik jika ia dipanggil /information.html dan meminta ubah hala luaran daripada info.html ke information.html. Walau bagaimanapun, atas sebab tertentu, pembangun tapak tidak boleh hanya menamakan semula info.html kepada information.html dan membuat ubah hala - dia memerlukan data dihantar terus daripada fail info.html. Dia menulis peraturan berikut: # buat ubah hala luaran RewriteRule ^info.html information.html # tetapi atas permintaan /information.html masih memberikan info.html RewriteRule ^information.html info.html

... dan berhadapan dengan gelung tidak berkesudahan. Setiap permintaan /information.html mendapat ubah hala luaran kembali ke /information.html.

Masalah ini boleh diselesaikan dengan sekurang-kurangnya dua cara. Salah satu daripadanya telah diterangkan pada Habré - anda perlu memasangnya pembolehubah persekitaran dan berdasarkan nilainya, hentikan ubah hala. Kod akan kelihatan seperti ini:

RewriteCond %(ENV:REDIRECT_FINISH) !^$ RewriteRule ^ - [L] RewriteRule ^info.html$ information.html RewriteRule ^information.html$ info.html

Ambil perhatian bahawa mod_rewrite menambahkan "REDIRECT_" pada nama pembolehubah.

Cara kedua ialah menyemak THE_REQUEST apa sebenarnya yang diminta oleh pengguna:

# Ubah hala luaran hanya berlaku jika pengguna meminta info.html. # Jika info.html ialah hasil ubah hala dalaman, peraturan itu tidak akan dicetuskan. RewriteCond %(THE_REQUEST) "^(GET|POST|HEAD) /info.html HTTP/+$" RewriteRule ^info.html$ information.html RewriteRule ^information.html$ info.html

Menganalisis permintaan pengguna asal - memerangi pendedahan pautan Apache

Apabila memproses permintaan, Apache mengembangkan aksara yang dikodkan URL daripada permintaan asal. Dalam sesetengah kes, ini mungkin tidak diingini - pembangun mahu menyemak dengan tepat permintaan pengguna asal yang tidak diubah suai. Ini boleh dilakukan dengan menyemak pembolehubah %(THE_REQUEST) dalam RewriteCond:

RewriteCond %(THE_REQUEST) ^GET[\ ]+/tag/([^/]+)/[\ ]+HTTP.*$ RewriteRule ^(.*)$ index.php?tag=%1 [L]

Apabila membuat aplikasi konsol dalam bahasa pengaturcaraan C++, baris yang hampir sama dengan ini dibuat secara automatik:

Int main(int argc, char* argv) // parameter fungsi main().

Baris ini adalah pengepala fungsi utama main() , parameter argс dan argv diisytiharkan dalam kurungan. Jadi, jika program itu dilancarkan melalui baris arahan, maka adalah mungkin untuk menghantar beberapa maklumat kepada program ini; inilah sebabnya parameter argc dan argv wujud. parameter argc mempunyai jenis data int, dan mengandungi bilangan parameter yang dihantar ke fungsi utama. Selain itu, argc sentiasa sekurang-kurangnya 1, walaupun apabila kami tidak menghantar sebarang maklumat, kerana parameter pertama ialah nama fungsi. Parameter argv ialah tatasusunan penunjuk kepada rentetan. Hanya data boleh dipindahkan melalui baris arahan jenis rentetan. Penunjuk dan rentetan ialah dua topik besar yang mana bahagian berasingan telah dibuat. Oleh itu, melalui parameter argv bahawa sebarang maklumat dihantar. Mari bangunkan program yang akan kami lancarkan melalui baris arahan rentetan Windows, dan berikan dia sedikit maklumat.

// argc_argv.cpp: Mentakrifkan titik masuk untuk aplikasi konsol. #include "stdafx.h" #include menggunakan ruang nama std; int main(int argc, char* argv) ( if (argc ><< argv<

// kod Kod::Blok

// Kod Dev-C++

// argc_argv.cpp: Mentakrifkan titik masuk untuk aplikasi konsol. #termasuk menggunakan ruang nama std; int main(int argc, char* argv) ( if (argc > 1) // jika kita lulus hujah, maka argc akan lebih besar daripada 1 (bergantung kepada bilangan hujah) ( cout<< argv<

Selepas kami menyahpepijat program, buka baris arahan Windows dan seret fail boleh laku program kami ke dalam tetingkap baris arahan. Laluan penuh ke program akan dipaparkan dalam baris arahan (tetapi anda boleh memasukkan laluan ke program secara manual ), selepas itu anda boleh klik MASUK dan program akan bermula (lihat Rajah 1).

Rajah 1 - Parameter fungsi utama

Memandangkan kami hanya menjalankan program dan tidak memberikan sebarang hujah kepadanya, mesej Bukan argumen muncul. Rajah 2 menunjukkan pelancaran program yang sama melalui baris arahan, tetapi memberikannya hujah Terbuka.

Rajah 2 - Parameter fungsi utama

Hujahnya ialah perkataan Terbuka, seperti yang dapat dilihat dari rajah, perkataan ini muncul di skrin. Anda boleh lulus beberapa parameter sekaligus, memisahkannya dengan koma. Jika anda perlu lulus parameter yang terdiri daripada beberapa perkataan, maka ia mesti disertakan dalam petikan berganda, dan kemudian perkataan ini akan dianggap sebagai satu parameter. Sebagai contoh, angka menunjukkan pelancaran program, menyampaikan hujah yang terdiri daripada dua perkataan - Ia berfungsi.

Rajah 3 - Parameter fungsi utama

Dan jika anda mengalih keluar petikan. Kemudian kita hanya akan melihat perkataan Ia. Jika anda tidak bercadang untuk menghantar sebarang maklumat semasa menjalankan program, anda boleh mengalih keluar argumen dalam fungsi main() dan anda juga boleh menukar nama argumen ini. Kadangkala pengubahsuaian pada parameter argc dan argv ditemui, tetapi ini semua bergantung pada jenis aplikasi yang dibuat atau pada persekitaran pembangunan.