นามแฝงและ mod_rewrite

ฉันกำลังพยายามให้ Symfony1.4 และ Symfony2 ทำงานบนโฮสต์เดียวกันใน Apache (2.2.22) - ฉันคิดว่าปัญหาคือทั้งคู่ใช้ mod_rewrite เพื่อส่งคำขอโดยตรงไปยังตัวควบคุม/สคริปต์ php นี่คือการกำหนดค่าของฉัน

httpd.conf

# Symfony 1.4
<VirtualHost *:80>
  DocumentRoot "d:/wamp/www/wlnew/web"
  DirectoryIndex index.php
  <Directory "d:/wamp/www/wlnew/web">
    AllowOverride All
    Allow from All
  </Directory>

  Alias /sf d:/wamp/www/wlnew/lib/vendor/symfony/data/web/sf
  <Directory "d:/wamp/www/wlnew/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>
# Symfony 2
Alias /another "d:/wamp/www/another/web/"
<Directory "d:/wamp/www/another/web">
    Options Indexes FollowSymlinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

จากนั้น Symfony แต่ละเวอร์ชันจะมี .htaccess ซึ่งใช้ในการเขียนคำขอใหม่

ซิมโฟนี 1 .htaccess

Options +FollowSymLinks +ExecCGI
<IfModule mod_rewrite.c>
  RewriteEngine On

  RewriteRule ^$ index.html [QSA]
  RewriteRule ^([^.]+)$ $1.html [QSA]
  RewriteCond %{REQUEST_FILENAME} !-f

  # no, so we redirect to our front web controller
  RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

ซิมโฟนี 2 .htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>

ฉันต้องการให้สามารถใช้ localhost/ เพื่อเปลี่ยนเส้นทางไปยังตัวควบคุมด้านหน้า Symfony 1 index.php แต่เมื่อฉันใช้ localhost/another คำขอทั้งหมดควรส่งต่อไปยังตัวควบคุมด้านหน้า symfony2 app.php แต่ไม่ได้เป็นเช่นนั้น - พวกเขาจะถูกส่งต่อไปยังตัวควบคุมด้านหน้า symfony1 (index.php) ถ้าฉันใช้ชื่อไฟล์ของคอนโทรลเลอร์สำหรับ Symfony2 มันจะใช้งานได้เช่น localhost/another/app.php

ฉันจะรับ apache เพื่อส่งต่อคำขอไปยังคอนโทรลเลอร์ Symfony2 ได้อย่างไรเมื่อฉันใช้นามแฝง /another

อัปเดต

ฉันเปิดใช้งานการบันทึกการบันทึกการเขียนซ้ำ ... นี่คือสิ่งที่ฉันได้รับ:

[perdir D:/wamp/www/another/web/] strip per-dir prefix: D:/wamp/www/another/web/ -> 
[perdir D:/wamp/www/another/web/] applying pattern '^(.*)$' to uri ''
[perdir D:/wamp/www/another/web/] RewriteCond: input='D:/wamp/www/another/web/' pattern='!-f' => matched
[perdir D:/wamp/www/another/web/] rewrite '' -> 'app.php'
[perdir D:/wamp/www/another/web/] add per-dir prefix: app.php -> D:/wamp/www/another/web/app.php
[perdir D:/wamp/www/another/web/] internal redirect with D:/wamp/www/another/web/app.php [INTERNAL REDIRECT]
[perdir D:/wamp/www/wlnew/web/] add path info postfix: D:/wamp/www/wlnew/web/wamp -> D:/wamp/www/wlnew/web/wamp/www/another/web/app.php
[perdir D:/wamp/www/wlnew/web/] strip per-dir prefix: D:/wamp/www/wlnew/web/wamp/www/another/web/app.php -> wamp/www/another/web/app.php
[perdir D:/wamp/www/wlnew/web/] applying pattern '^$' to uri 'wamp/www/another/web/app.php'
[perdir D:/wamp/www/wlnew/web/] add path info postfix: D:/wamp/www/wlnew/web/wamp -> D:/wamp/www/wlnew/web/wamp/www/another/web/app.php
[perdir D:/wamp/www/wlnew/web/] strip per-dir prefix: D:/wamp/www/wlnew/web/wamp/www/another/web/app.php -> wamp/www/another/web/app.php
[perdir D:/wamp/www/wlnew/web/] applying pattern '^([^.]+)$' to uri 'wamp/www/another/web/app.php'
[perdir D:/wamp/www/wlnew/web/] add path info postfix: D:/wamp/www/wlnew/web/wamp -> D:/wamp/www/wlnew/web/wamp/www/another/web/app.php
[perdir D:/wamp/www/wlnew/web/] strip per-dir prefix: D:/wamp/www/wlnew/web/wamp/www/another/web/app.php -> wamp/www/another/web/app.php
[perdir D:/wamp/www/wlnew/web/] applying pattern '^(.*)$' to uri 'wamp/www/another/web/app.php'
[perdir D:/wamp/www/wlnew/web/] RewriteCond: input='D:/wamp/www/wlnew/web/wamp' pattern='!-f' => matched
[perdir D:/wamp/www/wlnew/web/] rewrite 'wamp/www/another/web/app.php' -> 'index.php'
[perdir D:/wamp/www/wlnew/web/] add per-dir prefix: index.php -> D:/wamp/www/wlnew/web/index.php
[perdir D:/wamp/www/wlnew/web/] strip document_root prefix: D:/wamp/www/wlnew/web/index.php -> /index.php
[perdir D:/wamp/www/wlnew/web/] internal redirect with /index.php [INTERNAL REDIRECT]
[perdir D:/wamp/www/wlnew/web/] strip per-dir prefix: D:/wamp/www/wlnew/web/index.php -> index.php
[perdir D:/wamp/www/wlnew/web/] applying pattern '^$' to uri 'index.php'
[perdir D:/wamp/www/wlnew/web/] strip per-dir prefix: D:/wamp/www/wlnew/web/index.php -> index.php
[perdir D:/wamp/www/wlnew/web/] applying pattern '^([^.]+)$' to uri 'index.php'
[perdir D:/wamp/www/wlnew/web/] strip per-dir prefix: D:/wamp/www/wlnew/web/index.php -> index.php
[perdir D:/wamp/www/wlnew/web/] applying pattern '^(.*)$' to uri 'index.php'
[perdir D:/wamp/www/wlnew/web/] RewriteCond: input='D:/wamp/www/wlnew/web/index.php' pattern='!-f' => not-matched
[perdir D:/wamp/www/wlnew/web/] pass through D:/wamp/www/wlnew/web/index.php

ดูเหมือนว่า .htaccess สำหรับ Symfony2 (/another) กำลังถูกอ่านและเปลี่ยนเส้นทางไปที่ app.php แต่จากนั้นอ่าน .htaccess อื่น ๆ แล้วเปลี่ยนเส้นทางไปที่ index.php ... ฉันจะทำให้การเขียนซ้ำหยุดที่ app.php ได้อย่างไร


person Manse    schedule 22.01.2013    source แหล่งที่มา
comment
จะเป็นอย่างไรถ้าคุณย้ายนามแฝงสำหรับ sf2 ไปไว้บนไฟล์ conf ของคุณล่ะ?   -  person cheesemacfly    schedule 22.01.2013
comment
@cheesemacfly ไม่แตกต่างกัน :-(   -  person Manse    schedule 22.01.2013
comment
พฤติกรรมเดียวกันสำหรับทั้ง localhost/another และ localhost/another/?   -  person cheesemacfly    schedule 22.01.2013
comment
@cheesemacfly ใช่ - ดูเหมือนว่าปัญหาจะเกิดกับ Symfony 1 .htaccess - ไม่พบไฟล์ดังนั้นจึงเปลี่ยนเส้นทางไปที่ index.php ด้วยเหตุผลบางประการที่นามแฝงดูเหมือนจะถูกเพิกเฉย   -  person Manse    schedule 22.01.2013
comment
ในตอนแรก ฉันเห็นว่า Alias /another "d:/wamp/www/another/web/" ของคุณมีเครื่องหมายสแลชต่อท้ายสำหรับไดเร็กทอรี ในขณะที่การประกาศคำสั่ง <Directory "d:/wamp/www/another/web"> ของคุณไม่มี แต่อันสำหรับ 1.4 ก็ดูดีนะ อาจจะ? :)   -  person Nandeep Mali    schedule 29.01.2013
comment
แม้ว่าเครื่องหมายทับต่อท้ายจะไม่ส่งผลต่อคำสั่ง Directory เป็นสิ่งสำคัญสำหรับคำสั่งอื่นๆ เช่น DocumentRoot และ Location เท่านั้น   -  person Nandeep Mali    schedule 29.01.2013
comment
@NandeepMali ฉันได้ลองใช้เครื่องหมายทับทั้งหมดแล้ว - ยังไม่มีความสุข - ฉันคิดว่าปัญหาคือไฟล์ .htaccess หลายไฟล์ - ฉันได้รวมบันทึกแล้ว   -  person Manse    schedule 29.01.2013
comment
ฉันคิด ตามที่ฉันเขียนไว้ในความคิดเห็นที่สองมันไม่สำคัญ แต่คุณสามารถลองสิ่งนี้: gist.github.com/9488026f5cefd8ccee3c (เพิ่มในส่วนสำคัญเนื่องจากการตอบกลับยาว แต่ไม่แน่ใจเพราะไม่มีเครื่องให้ลอง)   -  person Nandeep Mali    schedule 29.01.2013
comment
เพิ่งอัพเดตเนื้อเรื่องนิดหน่อย   -  person Nandeep Mali    schedule 29.01.2013
comment
@NandeepMali ฉันคิดว่าคุณอาจจะกำลังทำอะไรบางอย่างที่นี่ - กำลังทดสอบตอนนี้   -  person Manse    schedule 29.01.2013
comment
@NandeepMali การเพิ่ม RewriteCond %{REQUEST_URI} !=/app.php ไม่ได้สร้างความแตกต่างเลย ฉันเปลี่ยนเป็น RewriteCond %{REQUEST_URI} !=D:/wamp/www/wlnew/web/wamp สิ่งเดียวกัน ..   -  person Manse    schedule 29.01.2013
comment
ให้เราสนทนาต่อในการแชท   -  person Nandeep Mali    schedule 29.01.2013


คำตอบ (2)


ดูเหมือนว่าการกำหนดค่าจะต้องตั้งค่า RewriteBase สำหรับทั้ง .htaccess

RewriteBase /another

สิ่งนี้ควรจะได้ผล ลิงก์นี้ช่วยในการตอบคำถามนี้

นอกจากนี้ ต่อไปนี้เป็นหมายเหตุบางส่วนจากการสนทนาของเราในการแชท เกี่ยวกับผลกระทบของการตั้งค่าอื่นๆ และวิธีที่ RewriteCond แก้ไขได้ ลูปการเปลี่ยนเส้นทางภายในที่ไม่มีที่สิ้นสุด อาจช่วยเหลือผู้อื่นได้ โดยรวมแล้ว mod_rewrite ถือเป็นโมดูลที่ยากอย่างหนึ่ง

person Nandeep Mali    schedule 29.01.2013

ลองย้ายนามแฝง Symfony 2 ภายใน VirtualHost และเพิ่มอีก DirectoryIndex สำหรับ sf2:

<VirtualHost *:80>
  # Symfony 1.4
  DocumentRoot "d:/wamp/www/wlnew/web"
  <Directory "d:/wamp/www/wlnew/web">
    DirectoryIndex index.php
    AllowOverride All
    Allow from All
  </Directory>

  Alias /sf d:/wamp/www/wlnew/lib/vendor/symfony/data/web/sf
  <Directory "d:/wamp/www/wlnew/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>

  # Symfony 2
  Alias /another "d:/wamp/www/another/web/"
  <Directory "d:/wamp/www/another/web">
    DirectoryIndex app.php
    Options Indexes FollowSymlinks
    AllowOverride All
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>
person j0k    schedule 22.01.2013
comment
ยังคงเป็นปัญหาเดิม .. ขอบคุณสำหรับคำตอบ .. ดูเหมือนว่าไม่มีใครใช้ Symfony1.4 และ Symfony2 ทำงานร่วมกัน .. ฉันมีแอปพลิเคชันที่เขียนใน 1.4 ที่ฉันย้ายไปที่ 2 - ทุกอย่างอื่นอยู่ร่วมกันนอกเหนือจากนี้ !! ! - person Manse; 23.01.2013
comment
นี่เป็นเรื่องแปลก ฉันได้ทดสอบแล้ว (ด้วยไดเร็กทอรีว่าง ไม่ใช่อินสแตนซ์ของแต่ละซิมโฟนี) และพฤติกรรมนั้นถูกต้อง - person j0k; 23.01.2013
comment
ฉันจะตัด httpd.conf ของฉันออกทันทีและทดสอบ - แต่เมื่อใช้คำขอข้างต้นสำหรับ localhost/อีกอันหนึ่งยังคงได้รับคำตอบจากคอนโทรลเลอร์ symfony1.4 - person Manse; 23.01.2013
comment
ไม่ - ยังคงเหมือนเดิม - index.php ยังคงตอบคำขอเมื่อขอ localhost/another หรือ localhost/another/ - อย่างที่คิดว่า .htaccess ใน /another/web จะถูกละเว้น - person Manse; 23.01.2013