Saya telah menetapkan file htaccess untuk situs web saya yang memiliki kode ini:

RewriteEngine on
RewriteBase /

RewriteRule ^bit_auth\/?(.*)$ /cig/base3/auth/$1 [R=301,NC,L]
RewriteCond $1 !^(index\.php|images|robots\.txt|assets|themes|includes)
RewriteRule ^(.*)$ /cig/base3/index.php/$1 [L]

Saya ingin menjaga jalur root situs saya dalam variabel seperti ini:

RewriteEngine on
RewriteBase /
SetEnv BASE_PATH "/cig/base3"

RewriteRule ^bit_auth\/?(.*)$ %{ENV:BASE_PATH}/auth/$1 [R=301,NC,L]
RewriteCond $1 !^(index\.php|images|robots\.txt|assets|themes|includes)
RewriteRule ^(.*)$ %{ENV:BASE_PATH}/index.php/$1 [L]

Karena saya mungkin perlu menggunakan nilai BASE_PATH dalam lebih banyak kode nanti dan juga dapat diubah dan saya tidak ingin mencari dan mengganti setiap kali di file htaccess saya. Tetapi ketika saya menggunakan kode di atas, dalam file htaccess %{ENV:BASE_PATH} mengembalikan nilai kosong daripada yang diharapkan /cig/base3 tetapi di php ketika saya menyebutnya menggunakan:

<?php $specialPath = getenv('BASE_PATH'); var_dump($specialPath)?>

ini menunjukkan nilai /cig/base3 yang benar.

Apa masalah dalam kode saya dan bagaimana saya bisa menyelesaikannya?

18
Mojtaba Rezaeian 22 Mei 2015, 17:17
3
Ada kekhasan dalam urutan di mana Apache memuat/menjalankan modul - mod_rewrite selalu berjalan sebelum SetEnv sehingga Anda tidak dapat menggunakan SetEnv untuk menyetel variabel lingkungan yang ingin Anda gunakan di RewriteRiule; namun Anda dapat menyetel variabel dengan RewriteRule; misalnya RewriteRule .* - [E=BASE_PATH:/cig/base3]
 – 
CD001
22 Mei 2015, 17:21
Saya tidak begitu mengerti mengapa saya harus menggunakannya dengan cara ini tetapi ketika saya memasukkan kode Anda ke file htaccess saya, itu berfungsi seperti yang diharapkan. apakah Anda memiliki referensi untuk deskripsi/detail lebih lanjut dan juga contoh untuk pengguna yang tidak berpengalaman? atau tolong jelaskan lebih lanjut.
 – 
Mojtaba Rezaeian
22 Mei 2015, 17:38

1 menjawab

Jawaban Terbaik

Anda tidak dapat menggunakan SetEnv seperti itu karena belum diproses.

Variabel lingkungan internal yang ditetapkan oleh arahan ini ditetapkan setelah sebagian besar arahan pemrosesan permintaan awal dijalankan, seperti kontrol akses dan pemetaan URI-ke-nama file. Jika variabel lingkungan yang Anda atur dimaksudkan sebagai masukan ke dalam fase awal pemrosesan ini seperti direktif RewriteRule, Anda harus menyetel variabel lingkungan dengan SetEnvIf.

Yang Anda cari adalah setenvif, bukan SetEnv

Jadi kamu harus bisa melakukan sesuatu seperti

SetEnvIf Request_URI "^.*" base_path=/cig/base3

http://httpd.Apache.org/docs/2.2/mod/mod_setenvif.html#setenvif

14
Panama Jack 22 Mei 2015, 17:38
2
^ @mrez.ir Inilah yang saya maksud dengan komentar saya... Saya sedang bekerja jadi saya tidak punya waktu untuk menulis jawaban koheren yang diformat sepenuhnya ;) SetEnvIf (tidak seperti SetEnv) akan berjalan sebelum mod_rewrite - tetapi Anda juga dapat mengatur variabel lingkungan dengan mod_rewrite itu sendiri - keduanya berfungsi.
 – 
CD001
22 Mei 2015, 17:42
Tetapi kedua jawaban itu benar. Saya tidak mengerti mengapa saya harus melakukannya dengan cara ini? dan mana yang lebih benar?
 – 
Mojtaba Rezaeian
22 Mei 2015, 17:45
2
@mrez.ir - keduanya melakukan hal yang sama, hanya dengan cara yang berbeda - bagaimanapun, Anda berakhir dengan set variabel lingkungan. Saya lebih suka melakukannya melalui RewriteRule jika saya menggunakan variabel dengan RewriteRules... tapi itu tidak masalah.
 – 
CD001
22 Mei 2015, 17:48
Apakah itu memperlambat perilaku htaccess asli? Maksud saya memuat sesuatu dua kali?
 – 
Mojtaba Rezaeian
22 Mei 2015, 17:52
1
@mrez.ir .htaccess hanya dibaca sekali ketika direktori dipindai tetapi .htaccess dibaca pada setiap permintaan dan semuanya diproses sesuai dengan itu. Jadi itu tidak akan benar-benar memperkenalkan kelambatan lagi daripada perilaku defaultnya.
 – 
Panama Jack
22 Mei 2015, 17:55